Rails 关于 devise 使用中出现的 ArgumentError

realwol · 2013年05月17日 · 最后由 realwol 回复于 2013年05月18日 · 2953 次阅读

本人刚开始使用 devise,遇到来如下问题: 其他配置正确的情况下,按照http://hlee.iteye.com/blog/673058#bc2295346 文中设置开始,不过本人 ENV: ruby 1.9.3; rails 3.2.11; devise 1.1.rc0 在访问 devise 页面之前其他步骤小有波折,但都通过,且跟如下主要问题无关,是一个 mysql 的问题。 当我启动 webrick 之后,开始访问 devise 自带网页 http://127.0.0.1:3000/users/confirmation
返回的错误如下: ArgumentError in Devise/confirmations#show

Showing /home/lihao/web/demo5/app/views/devise/confirmations/new.html.erb where line #3 raised:

wrong number of arguments (3 for 2)

Extracted source (around line #3):

1:

Resend confirmation instructions

2: 3: <%= form_for(resource_name, resource, :url => confirmation_path(resource_name)) do |f| %> 4: <%= f.error_messages %> 5: 6:

<%= f.label :email %>

Rails.root: /home/lihao/web/demo5

我查了许久发现还是有两个解决途径: 1,升级 devise。 2,将第三行 <%= form_for(resource_name, resource, :url => confirmation_path(resource_name)) do |f| %> 改为 <%= form_for( resource, :as=>resource_name, :url => confirmation_path(resource_name)) do |f| %> 我先尝试方法 2,修改之后回出现 unknowmethod 的错误,这个暂且不说。当我升级 devise 到 2.2.3 之后,再执行方法 2,这次可以显示了。可是我总不能能逐个去修改吧。 所以,如果有人遇到过,麻烦能给小弟带个路。感激不尽。 (注:发帖之前搜索发现无类似帖子,如果有情给个链接,我即可删除,谢过。)

form_for 是只有两个参数的

form_for(record, options = {}, &block)

devise 的 view 也是这么写的 https://github.com/plataformatec/devise/blob/master/app/views/devise/confirmations/new.html.erb#L3

你的 form_for(resource_name, resource, :url => confirmation_path(resource_name)) 是哪里来的?

#1 楼 @cantin generate 来的,而且在我上边链接里发的 blog 里边,作者的 views 文件中也是这个样子的。

#1 楼 @cantin 为什么源码中的是这样,可是我生成的是这个两个是相反的?而且,看那个 blog,以及在 stackoverflow 里边的提问,这个不是个例。请问,你生成的 devise views 里的和源码一致吗?没遇到过这个问题?

#1 楼 @cantin 我找到问题了。 我想请问你在是不是有一句 rails g devise:install 的语句。可是看的那个 blog 里边是 devise_install,以及后边生成自定义 iews 的时候也是 devise_views。这就导致生成的 views 跟源文件有差异,所以这就是问题所在,至于为什么会这样,我就不知道了。以后有机会再研究下。总之,谢谢你这么热心,不是你提醒,我也注意不到,谢了哈。

那个 blog 是 10 年的,你要看的话应该看https://github.com/plataformatec/devise generator 只是 copy 了 devise 的 view 到你项目里面

另外 ArgumentError 明显是 method 方法的异常,应该首先去查 form_for 的文档 rails 2 中的 form_for 的参数是 form_for(record_or_name_or_array, *args, &proc) 所以上面的写法应该是 rails 2 的

#5 楼 @cantin 恩,可是 blog 上说的是 rails3 的,我质疑他是因为按照他的方法 rake routes 之后,返回和他的不一样,但是刚才认真看了 git 上文档之后,发现了问题改正之后运行 rake routes 得到跟 blog 里边的一样的内容。。。所以看来,他的 blog 未免有不实之嫌。

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