Rails wrong number of arguments (0 for 1)

VincentJiang · 2014年01月11日 · 最后由 boyishwei 回复于 2014年01月12日 · 3880 次阅读

我在 Controller 中写了以下方法:

def mkpdf(certificate)

  # mke the pdf folder
  unless Dir.exist?("pdf")
    Dir.mkdir("pdf")
  end
end

在 routes.rb 中有:

get 'mkpdf' => "certificates#mkpdf"

在页面中有:

mkpdf_path(certificate)

当我点击页面的 mkpdf_path 相应的连接的时候,发生了wrong number of arguments (0 for 1)的报错,请问我代码哪里错了?

少年为何不先看一遍书

#1 楼 @o_0 看过不止一遍了,若你能找出问题所在就回复吧

#2 楼 @jxs471494539 action定义时是不用包含参数的啊。而且mkpdf_path(certificate)的用法也错了。先看看书吧。

#3 楼 @Martin91 请问mkpdf_path(certificate)如何错?谢谢

#4 楼 @jxs471494539 先不谢。mkpdf_path这类自动生成的 routes helpers 只是返回一个 path 链接,并不可能直接调用 controller 里边的 action。action 的调用过程应该是:路由系统判断请求的 url,结合你在 config/routes.rb 里边的定义,然后将你的请求分发到指定的 action,action 通过 params hash 读取需要的请求参数。建议你得先去读一下计算机网络方面的书籍了。

controller 的 action 方法的参数都是采用 params 来处理的,所以将 controller 中的 mkpdf 方法修改为参的就好了。。

mkpdf_path(certificate) != mkpdf(certificate)调用。 一个是个 url helper. 一个是个 action. 根本不等,所以参数传不过去,当然报错。虽然通过路由配置最后调到了 certificate/mkpdf..

#7 楼 @boyishwei 那我应该怎样才能把 certificate 这个参数传到后台 mkpdf 的 action 去?因为我后台需要对 certificate 这个对象的相关属性进行调用

# config/routes.rb
get "mkpdf/:certificate_id" => "certificate#mkpdf", :as => "mkpdf"

具体调用:

mkpdf_path(certificate_id)

关于路由建议楼主认真读下 Rails Guide 的Routing一章……

#9 楼 @allenfantasy 请问后台的 action 代码如何写?

#10 楼 @jxs471494539

def mkpdf
  certificate = Certificate.find params[:certificate_id]

  # mke the pdf folder
  unless Dir.exist?("pdf")
     Dir.mkdir("pdf")
  end
end

#9 楼 @allenfantasy #11 楼 @Martin91 感谢两位的提示,让我在登机关手机前得到提示,相信在空中可以完成我的 coding,谢谢

9 楼 plus 11 楼 完美解决,,,, 楼主再了解下 xxx_path 跟 params 参数传递,就完全明白了,,,

需要 登录 后方可回复, 如果你还没有账号请 注册新账号