假设我有方法A
def methodA
note = Note.find(params[:id])
note.link = params[:link]
note.linktype = params[:linktype]
note.save
redirect_to(notes_url)
end
当我从这样的 View 调用这个方法时,它工作正常
<%= link_to image_tag(w.link, :border =>0), methodA_path(:linktype => w.linktype, :link => w.link, :id => @note.id) %>
但是,如果我像这样从同一个 Controller 中的另一个方法调用该方法:
def methodB
...
methodA(:id => params[:id], :link => link, :linktype => "image")
end
我收到这个错误:
wrong number of arguments (1 for 0)
方法 A 获取的参数仍然是方法 B 获取的相同参数,而不是我从方法 B 发送的参数。我该如何解决这个问题?感谢阅读。
最佳答案
几件事:
- Ruby 以及 Ruby on Rails 的命名约定是使用下划线表示法而不是驼峰式命名。所以应该是
method_a
而不是methodA
。 - 看起来
methodA
是一个 Controller Action 。如果您查看方法签名,您实际上并没有定义任何方法参数。这是一件好事:行动不需要任何东西。 methodA
操作中的params
调用不是访问方法参数,而是访问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 版)。
关于ruby-on-rails - 如何在 RoR 中调用方法并发送新参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3287089/