假设我有方法A
def methodA
note = Note.find(params[:id])
note.link = params[:link]
note.linktype = params[:linktype]
note.save
redirect_to(notes_url)
end
当我从这样的视图中调用此方法时,它可以正常工作
<%= link_to image_tag(w.link, :border =>0), methodA_path(:linktype => w.linktype, :link => w.link, :id => @note.id) %>
但是,如果我从同一控制器中的另一个方法调用该方法,如下所示:
def methodB
...
methodA(:id => params[:id], :link => link, :linktype => "image")
end
我收到此错误:
wrong number of arguments (1 for 0)
methodA获取的参数仍然与methodB获得的参数相同,而不是我从methodB发送的参数。我该如何解决这个问题?感谢阅读。
答案 0 :(得分:4)
有几件事:
method_a
而不是methodA
。methodA
是控制器动作。如果查看方法签名,则实际上并未定义任何方法参数。这是一件好事:行动不会采取任何行动。params
操作中的methodA
调用不是访问方法参数,而是访问Rails请求params
hash. methodA_path
,它正在生成URL。这是url_for
的快捷方式,可以自动为您填写一些参数(其他参数位于您传递的哈希值中)。您的路线会自动为您生成此方法。从应用的根目录rake routes
获取更多信息。methodB
调用动作方法,这可能是不明智的,你不需要传递参数。由于methodB
也是在其自己的请求周期中调用的操作,params
哈希仍然可用于methodA
,并且它会发现所有这些事情都很好。但是,我建议将任何常用功能提取到第三个辅助方法中并从每个操作中调用它;从其他动作中调用动作对我来说就像是一种代码味道。一些摘要:methodA
和methodA_path
是不同的方法。前者不使用参数但访问Rails请求参数哈希,而后者则将参数传递给url_for
。
这一切都非常基础,所以我强烈建议你阅读Agile Web Development with Rails(Rails 2第3版,Rails 3第4版)。
答案 1 :(得分:2)
对method_a_path
和method_a
的通话不一样。
method_a
不接受参数。它在动作调用期间访问从params
哈希集到控制器实例的参数。
method_a_path
不会调用method_a
,它只会生成调用该方法的URL。当用户单击链接并且rails服务器处理请求时,会发生实际调用。
如果要在不同的上下文中重用该方法,请将操作的代码提取到新方法,如下所示:
class PostsController < ApplicationController
def add_media
add_media_with_para(params)
end
def action2
add_media_with_para(:id => params[:id], :link => link, :linktype => "image")
end
private
def add_media_with_para p = {}
note = Note.find(p[:id])
note.link = p[:link]
note.linktype = p[:linktype]
note.save
redirect_to(notes_url)
end
end
现在,在您的视图中,您可以获取add_media操作的路径,如下所示:
posts_add_media_path(:linktype => w.linktype, :link => w.link, :id => @note.id)
答案 2 :(得分:0)
我认为addMedia是指methodA
注意,方法methodA_path
与methodA
不同。第一个是自动生成的,因为您有一个名为methodA
的路由并返回访问该路由所需的URL。因此,它返回字符串。虽然methodA
通常会呈现html模板。
如果要将渲染委托给其他操作,可以执行以下操作:redirect_to :action => :methodA, :id => 1, :otherParam => 2