'sessions_helper#remember'中的ArgumentError [Ruby 2.2.0,Rails 4.2.0]

时间:2015-01-25 11:17:12

标签: ruby-on-rails ruby session

我使用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 %>

1 个答案:

答案 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)