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

时间:2010-07-20 04:49:39

标签: 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

当我从这样的视图中调用此方法时,它可以正常工作

<%= 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发送的参数。我该如何解决这个问题?感谢阅读。

3 个答案:

答案 0 :(得分:4)

有几件事:

  • Ruby,因此Ruby on Rails,命名约定是使用下划线表示法而不是camelcase。所以它应该是method_a而不是methodA
  • 看起来methodA是控制器动作。如果查看方法签名,则实际上并未定义任何方法参数。这是一件好事:行动不会采取任何行动。
  • params操作中的methodA调用不是访问方法参数,而是访问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版)。

答案 1 :(得分:2)

method_a_pathmethod_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_pathmethodA不同。第一个是自动生成的,因为您有一个名为methodA的路由并返回访问该路由所需的URL。因此,它返回字符串。虽然methodA通常会呈现html模板。

如果要将渲染委托给其他操作,可以执行以下操作:redirect_to :action => :methodA, :id => 1, :otherParam => 2