我使用Michael Hartl教程开始了一个新的应用程序。一切都运转良好,除非我标记“记得'复选框(使用类session_helper中记住的方法),或使用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方法/ 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 %>
答案 0 :(得分:0)
可能是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)
。