Rails根据用户类型重定向



我正在通过构建一个商店应用程序来学习Rails,但我在重定向方面遇到了一些麻烦。我在应用程序中有三个角色:

  • 买方
  • 卖方
  • 管理员

根据他们登录的类型,我想重定向到不同的页面/操作,但仍然为每个页面显示相同的URL(http://.../my-account)。

我不喜欢在同一个视图中渲染局部,这看起来很混乱,有其他方法可以实现吗?

我能想到的唯一方法是在帐户控制器中有多个操作(例如,买方、卖方、管理员),但这意味着路径看起来像http://.../my-account/buyer或http://.../my-account/seller等

非常感谢,收到

我把我的代码放在下面:

models/user.rb

class User < ActiveRecord::Base
    def buyer?
        return type == 'buyer'
    end
    def seller?
        return type == 'seller'
    end
    def administrator?
        return type == 'administrator'
    end
    ...
end

控制器/帐户controller.rb

class AccountsController < ApplicationController  
   def show
   end
end

controllers/user_sessions_controller.rb

class UserSessionsController < ApplicationController
    def new
        @user_session = UserSession.new
    end
    def create
        @user_session = UserSession.new(params[:user_session])
        if @user_session.save
            if session[:return_to].nil?
            # I'm not sure how to handle this part if I want the URL to be the same for each.
                redirect_to(account_path)
            else
                redirect_to(session[:return_to])
            end
        else
            @user_session.errors.clear # Give as little feedback as possible to improve security.
            flash[:notice] = 'We didn't recognise the email address or password you entered, please try again.'
            render(:action => :new)
        end
    end
    def destroy
        current_user_session.destroy
        current_basket.destroy
        redirect_to(root_url, :notice => 'Sign out successful!')
    end
end

config/routes.rb

match 'my-account' => 'accounts#show'

非常感谢,收到

UserSessionsController#create(即:登录方法)中,您可以继续重定向到帐户路径(假设转到AccountsController#show),然后根据角色呈现不同的视图。例如:类似这样的东西:

class AccountsController < ApplicationController  
  def show
    if current_user.buyer?
      render 'accounts/buyer'
    elsif current_user.seller?
      render 'accounts/seller'
    elsif current_user.administrator?
      render 'accounts/administrator
    end
  end
end

更好的是,你可以按照惯例这样做。。。

class AccountsController < ApplicationController  
  def show
    render "accounts/#{current_user.type}"
  end
end

如果我正确理解你的问题,那么解决方案很简单。

您可以在控制器中调用所需的方法。我在我的项目中这样做:

def create
  create_or_update
end
def update
  create_or_update
end
def create_or_update
  ...
end

在您的情况下,它应该是:

def action
  if administrator? then
    admin_action
  elsif buyer? then
    buyer_action
  elseif seller? then
    seller_action
  else
    some_error_action
  end
end

不过,您可能应该在每个操作中显式调用带有操作名称的"render"。

相关内容

  • 没有找到相关文章

最新更新