0

用戶可以有多個組織。在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. 該組織
  2. 執行例如add_user_path執行set_session(organization)

這可能嗎?我雖然關於添加額外的路線和方法。然後這些將首先調用set_session(organization),然後再調用函數本身。但是那需要不少額外的路線和方法,也許還有更簡單的方法? (也許告訴link_to在視圖中執行兩種方法?雖然文件的link_to似乎不利於這樣)


更新:有沒有可能到第二路由添加作爲一個PARAM概覽頁面;例如(其他功能將有其他的語法比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

是沒可能您首先向用戶發送到'set_session'路線,然後重定向到用戶執行的動作? 您也可以將params傳遞給'link_to'函數,這樣可以將第一個param作爲'set_session'函數名稱傳遞並執行,然後第二個參數可以是您希望之後執行的函數名稱。 –

+0

不知道該怎麼做。一個問題是'logged_in_organization'還會調用'set_session'(將其添加到OP),然後將'redirect'添加到'set_session'會使'logged_in_organization'不再正常運行。 – Nick

+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 
+0

感謝@EugZol,而不是'before_action',你是否也有一個想法,我如何才能將這個想法運用到我在帖子更新中描述的工作中? – Nick

+0

@Nick您需要傳遞值作爲參數'move_on_path(organization:organization,url:adduser_path(organization_id:organization.id))',然後在您的控制器中,該操作不會收到任何參數'def move_on',但您可以訪問'params [:organization]'和'params [:url]'。 – MurifoX

+0

@ MurifoX的建議是正確的,你最好再提一個問題,因爲它是單獨的問題。在此之前查看[Action Controller Overview](http://guides.rubyonrails.org/action_controller_overview.html)指南是個不錯的主意。 – EugZol

相關問題