用户可以拥有多个组织。在session
哈希中,定义用户当前登录的组织(只能是1个组织)。还有一个视图,其中显示了用户所属组织表的概述。在此屏幕上,用户可以切换到另一个组织,该组织将session
哈希重置为该组织。简化版本(已删除验证):
def set_session(organization)
session[:logged_in_for] = organization.id
end
def logged_in_organization
set_session(user.organizations.first) if session[:logged_in_for].nil?
@organization = Organization.find(session[:logged_in_for])
end
概览屏幕还需要包含每个组织的其他功能(这些功能也可以从其他屏幕获得,例如每个组织的配置文件,因此它们的方法已经到位)。一个例子可能是为组织添加新用户的功能。
但是这些其他函数使用logged_in_organization
作为他们执行函数的组织(出于安全原因,我希望保持这种方式)。
因此,我想要的是,如果单击概览屏幕中的函数,它会在执行函数之前执行set_session(organization)
方法:
set_session(organization)
add_user_path
这可能吗?我想增加额外的路线和方法。然后,这些将首先调用set_session(organization)
,然后调用函数本身。但这需要相当多的其他路线和方法,也许还有更简单的方法吗? (也许告诉视图中的link_to
执行两个方法?虽然link_to文档似乎不方便这样做)
更新:是否可以在概览页面中添加第二条路线作为参数;例如(其他函数将具有除organization_id: organization.id
之外的其他语法,因此不是通用的):
<%= link_to "Add user", move_on_path( organization, adduser_path(organization_id: organization.id) ) %>
使用move_on方法:
def move_on(organization, url)
set_session(organization)
redirect_to url
end
点击此链接目前会产生错误,指向def move_on(organization, url)
:wrong number of arguments (0 for 2)
。我在这里做错了什么? P.S.我有以下路线:
get 'move_on' => 'user#move_on', as: 'move_on'
答案 0 :(得分:1)
在我看来,处理这种情况的最简单方法就是修改logged_in_organization
方法:
def logged_in_organization
@organization ||= begin
set_session(user.organizations.first) if session[:logged_in_for].nil?
@organization = Organization.find(session[:logged_in_for])
end
end
这样,如果已经设置,它将不会覆盖@organization
。然后你只需在相关控制器的before_action
中设置它,就像这样:
before_action :set_organization
def set_organization
@organization = current_user.organizations.find(params[:organization_id])
end