在respond_to块中共享代码

时间:2008-10-28 20:39:59

标签: ruby-on-rails ruby

我有以下before_filter

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

答案 0 :(得分:3)

如果我正确读到这一点,看起来find_current_membershipbefore_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

答案 1 :(得分:2)

在这种情况下,您可能会执行以下操作:

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

或者您可以使用request.format.rss?在您的控制器方法中有条件地加载成员资格。

无论哪种方式,您的第一步应该是将其重构为方法。

答案 2 :(得分:1)

这个简单的解决方案怎么样??

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