2008-10-28 100 views
1

我有以下before_filter共享代碼的respond_to塊

def find_current_membership 
    respond_to do |wants| 
     wants.html { @current_membership = @group.memberships.for(@current_user) } 
     wants.rss {} 
     wants.js { @current_membership = @group.memberships.for(@current_user) } 
    end 
    end 

我想和大家分享的代碼爲HTML和JS塊。有沒有更好的方法,而不是將代碼投入方法?我希望這會工作:

def find_current_membership 
    respond_to do |wants| 
     wants.rss {} 
     wants.all { @current_membership = @group.memberships.for(@current_user) } 
    end 
    end 

但唉,它沒有。

回答

3

如果我正在閱讀此權限,看起來像find_current_membership是您的before_filter方法,對嗎?例如:

class SomeController < ApplicationController 
    before_filter :find_current_membership 
    ... 

我認爲這是一個有點不規範使用respond_to一個before_filter裏面,他們是爲了只是做一些事情,渲染失敗。在我看來,你想要更像這樣的東西

class SomeController < ApplicationController 
     before_filter :find_current_membership 

     def some_action 
     # stuff, or maybe nothing 
     end 

    private 
     def find_current_membership 
     @current_membership = @group.memberships.for(@current_user) unless request.format.rss? 
     end 
    end 
2

在這種情況下,你或許可以這樣做:

before_filter :only => :find_current_membership do |c| 
    load_current_membership if not request.format.rss? 
end 

另外,您可以使用request.format.rss?在你的控制器方法中有條件地加載成員資格。

無論哪種方式,你的第一步應該是重構一個方法。

1

這個簡單的解決方案如何?!

def find_current_membership 
    @current_membership = @group.memberships.for(@current_user) 
    respond_to do |wants| 
    wants.html 
    wants.rss {} 
    wants.js 
    end 
end