我正在通过构建一个商店应用程序来学习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"。