'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).