Rails 关于 devise 使用中出现的 ArgumentError

realwol · May 17, 2013 · Last by realwol replied at May 18, 2013 · 2954 hits

本人刚开始使用 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 未免有不实之嫌。

You need to Sign in before reply, if you don't have an account, please Sign up first.