如何有效地组合一个链接调用两种方法?

时间:2015-08-13 12:53:40

标签: ruby-on-rails ruby ruby-on-rails-4 model-view-controller

用户可以拥有多个组织。在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)方法:

  1. 为该组织执行set_session(organization)
  2. 执行例如add_user_path
  3. 这可能吗?我想增加额外的路线和方法。然后,这些将首先调用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'
    

1 个答案:

答案 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