我正在通过构建商店应用程序来学习Rails,并且我在重定向方面遇到了一些麻烦。我在应用程序中有3个角色:
根据他们登录的类型,我想重定向到不同的页面/操作,但每个页面/操作仍显示相同的URL(http://.../my-account)。
我不喜欢在同一个视图中渲染局部视图,它看起来很混乱,还有其他方法可以实现吗?
我能想到的唯一方法是在帐户控制器中有多个操作(例如买方,卖方,管理员),但这意味着路径看起来像http://.../my-account/buyer或http://.../my-account/seller等。
非常感谢, 罗杰
我把我的代码放在下面:
class User < ActiveRecord::Base
def buyer?
return type == 'buyer'
end
def seller?
return type == 'seller'
end
def administrator?
return type == 'administrator'
end
...
end
class AccountsController < ApplicationController
def show
end
end
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
match 'my-account' => 'accounts#show'
非常感谢, 罗杰
答案 0 :(得分:4)
在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
答案 1 :(得分:0)
如果我理解你的问题是正确的,那么解决方案很简单。
您可以在控制器中调用所需的方法。我在我的项目中这样做:
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”。