ruby-on-rails - 如何在 RoR 中调用方法并发送新参数?

标签 ruby-on-rails ruby parameters

假设我有方法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,并且它将找到所有那些东西就好了。但是,我建议将任何通用功能提取到第三个辅助方法中,并从每个操作中调用它;从其他操作调用操作对我来说就像代码的味道。

一点总结:methodAmethodA_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/

相关文章:

ruby-on-rails - 使后台作业生成的文件可供下载

ruby-on-rails - 用于保护 SOAP Web 服务的非对称 key 加密

arrays - 通过唯一键合并 Ruby 中的两个数组

ruby-on-rails - Backbone.js 集合的客户端验证

ruby-on-rails - devise_token_auth 始终返回 401 未经授权

javascript - 我可以定义一个函数,该函数根据哪个选择器处于事件状态而采用可变参数吗?

Python下划线作为函数参数

Javascript function(params) 和 function({ params }),一个函数两种调用类型

ruby-on-rails - 迁移和 Rspec

ruby-on-rails - 如何使用 ActiveRecord::Base.connection.exec_query 获取输入结果