'sessions_helper#remember' [Ruby 2.2.0, Rails 4.2.0] 中的参数错误
ArgumentError in 'sessions_helper#remember' [Ruby 2.2.0, Rails 4.2.0]
我使用 Michael Hartl 教程开始了一个新的应用程序。一切正常,除非我标记了一个 'remember' 复选框(在 class sessions_helper 中使用方法 remember),或者使用 remember 方法。错误说我传递了 2 个参数而不是 1 个,但这很奇怪,因为我只传递了一个(用户)。
错误:
(463.7ms) commit transaction
Completed 500 Internal Server Error in 684ms
ArgumentError (wrong number of arguments (2 for 1)):
app/models/user.rb:44:in `remember'
app/helpers/sessions_helper.rb:30:in `remember'
app/controllers/sessions_controller.rb:10:in `create'
记忆方法:
/app/helpers/sessions_helper.rb
def remember user
user.remember
cookies.permanent.signed[:user_id] = user.id
cookies.permanent[:remember_token] = user.remember_token
end
/app/models/user.rb
def remember
self.remember_token = User.new_token
update_attributes(:remember_digest, User.digest(remember_token))
end
并且,调用 create/new method/action 的会话控制器:
/app/controllers/sessions_controller.rb
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
sign_in user
params[:session][:remember_me] == '1' ? remember(user) : forget(user)
redirect_to user
else
flash.now[:error] = "Wrong Login/password combination"
render 'new'
end
end
以及 sign_in 的形式:
/app/views/sessions/new.html.erb
<%= form_for(:session, url: signin_path) do |f| %>
<%= render 'fields', f: f %>
<%= f.label :remember_me, class: "checkbox inline" do %>
<%= f.check_box :remember_me %>
<span>Remember me on this computer</span>
<% end %>
<%= f.submit "Sign In!", class: "btn btn-primary" %>
<% end %>
可能是您的 User#remember 方法中的 update_attributes 方法导致了错误。您将两个参数传递给 update_attributes,但 update_attributes 只接受一个参数。
将 update_attributes(:remember_digest, User.digest(remember_token))
更改为 update_attributes({remember_digest: User.digest(remember_token)})
。 (当你将散列作为最后一个参数传递给方法时,你可以省略 {}
,但我添加它们是为了强调更新版本只将一个参数传递给方法。
app/models/user.rb:44:in 'remember'
表示错误发生在 User#remember 方法内部。如果由于您将错误数量的参数传递给 User#remember 方法而发生错误,则错误消息可能表明错误发生在您调用 remember 方法的地方。在你的情况下,params[:session][:remember_me] == '1' ? remember(user) : forget(user)
.
我使用 Michael Hartl 教程开始了一个新的应用程序。一切正常,除非我标记了一个 'remember' 复选框(在 class sessions_helper 中使用方法 remember),或者使用 remember 方法。错误说我传递了 2 个参数而不是 1 个,但这很奇怪,因为我只传递了一个(用户)。
错误:
(463.7ms) commit transaction
Completed 500 Internal Server Error in 684ms
ArgumentError (wrong number of arguments (2 for 1)):
app/models/user.rb:44:in `remember'
app/helpers/sessions_helper.rb:30:in `remember'
app/controllers/sessions_controller.rb:10:in `create'
记忆方法:
/app/helpers/sessions_helper.rb
def remember user
user.remember
cookies.permanent.signed[:user_id] = user.id
cookies.permanent[:remember_token] = user.remember_token
end
/app/models/user.rb
def remember
self.remember_token = User.new_token
update_attributes(:remember_digest, User.digest(remember_token))
end
并且,调用 create/new method/action 的会话控制器:
/app/controllers/sessions_controller.rb
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
sign_in user
params[:session][:remember_me] == '1' ? remember(user) : forget(user)
redirect_to user
else
flash.now[:error] = "Wrong Login/password combination"
render 'new'
end
end
以及 sign_in 的形式:
/app/views/sessions/new.html.erb
<%= form_for(:session, url: signin_path) do |f| %>
<%= render 'fields', f: f %>
<%= f.label :remember_me, class: "checkbox inline" do %>
<%= f.check_box :remember_me %>
<span>Remember me on this computer</span>
<% end %>
<%= f.submit "Sign In!", class: "btn btn-primary" %>
<% end %>
可能是您的 User#remember 方法中的 update_attributes 方法导致了错误。您将两个参数传递给 update_attributes,但 update_attributes 只接受一个参数。
将 update_attributes(:remember_digest, User.digest(remember_token))
更改为 update_attributes({remember_digest: User.digest(remember_token)})
。 (当你将散列作为最后一个参数传递给方法时,你可以省略 {}
,但我添加它们是为了强调更新版本只将一个参数传递给方法。
app/models/user.rb:44:in 'remember'
表示错误发生在 User#remember 方法内部。如果由于您将错误数量的参数传递给 User#remember 方法而发生错误,则错误消息可能表明错误发生在您调用 remember 方法的地方。在你的情况下,params[:session][:remember_me] == '1' ? remember(user) : forget(user)
.