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
将不会有太多用处。如果用户试图基于控制器动作对有效负载执行方法,此解决方案将很好地工作。当您在有效负载对象上执行上下文操作(例如,不喜欢、标记、书签等)时,这种类型的模式非常常见。