Ruby on rails 如何使控制器的动作停止?

Ruby on rails 如何使控制器的动作停止?,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,假设我有以下控制器: class FooController < ApplicationController def show end def a foo = Foo.find(params[:id]) foo.a redirect_to foo_url(foo) end def b foo = Foo.find(params[:id]) foo.b redirect_to foo_url(foo) end

假设我有以下控制器:

class FooController < ApplicationController

  def show
  end

  def a
    foo = Foo.find(params[:id])
    foo.a

    redirect_to foo_url(foo)
  end

  def b
    foo = Foo.find(params[:id])
    foo.b

    redirect_to foo_url(foo)
  end

  def c
    foo = Foo.find(params[:id])
    foo.c

    redirect_to foo_url(foo)
  end

end
class FooController

是否需要使用后过滤器来执行共享重定向代码?

我没有尝试过,但说可以使用后过滤器。

将它放在原处。在这种情况下,after_过滤器无法工作。

以下是重构后的代码:

class FooController < ApplicationController

  before_filter :get_foo, :except => [:show]

  def show
  end

  def a
    @foo.a
    redirect_to @foo
  end

  def b
    @foo.b
    redirect_to @foo
  end

  def c
    @foo.c
    redirect_to @foo
  end

  private

  def get_foo
    @foo = Foo.find(params[:id])
  end

end
class FooController[:show]
def秀
终止
定义a
@福安
将_重定向到@foo
终止
def b
@foo.b
将_重定向到@foo
终止
def c
@富科
将_重定向到@foo
终止
私有的
迪夫吉福
@foo=foo.find(参数[:id])
终止
终止
试试这个:

class FooController < ApplicationController

  def show
  end

  [:a, :b, :c].each do |name|
    define_method(name) do
      foo = Foo.find(params[:id])
      foo.send(:name)
      redirect_to foo_url(foo)    
    end
  end
end
class FooController
在这种情况下,
后过滤器将不起作用

我将使用以下方法

class FooController < ApplicationController

  before_filter :get_foo, :only => [:a, :b, :c]

  def show
  end

  def a
    do_and_redirect(:a)
  end

  def b
    do_and_redirect(:b)
  end

  def c
    do_and_redirect(:c)
  end

  private

  def get_foo
    @foo = Foo.find(params[:id])
  end

  def do_and_redirect(method_name)
    @foo.send(method_name)
    redirect_to foo_url(@foo)
  end

end
class FooController[:a,:b,:c]
def秀
终止
定义a
do_和_重定向(:a)
终止
def b
do_和_重定向(:b)
终止
def c
do_和_重定向(:c)
终止
私有的
迪夫吉福
@foo=foo.find(参数[:id])
终止
def do_和_重定向(方法_名称)
@foo.send(方法名称)
将_重定向到foo_url(@foo)
终止
终止

您是否试图找到一种将Foo公共方法映射到FooController操作的方法?我将省略最后一个方法(重定向到Foo),并将其保持为简单的
重定向到@Foo
在actionsYeah中,我实际上使用了体面的\u暴露,因此@Foo=Foo.find部分不是问题。我只是想让所有这些方法在不需要重复代码的情况下自动重定向。即使你的答案是正确的,我发现在现实世界的控制器中使用它是非常不可能的。假设问题中的示例只是一个通用示意图,
define\u method
将不会有太多用处。如果用户试图基于控制器动作对有效负载执行方法,此解决方案将很好地工作。当您在有效负载对象上执行上下文操作(例如,不喜欢、标记、书签等)时,这种类型的模式非常常见。