Empty argument - form for

79 Views Asked by At

I want to implement a reset password functionality so I have followed this railscast, I receive the mail with the link to redirect to an edit password page but I get an error here.

View

<h1>Reset Password</h1>

<%= form_for @user, :url => password_reset_path(params[:id]) do |f| %>
  <% if @user.errors.any? %>
    <div class="error_messages">
      <h2>Form is invalid</h2>
      <ul>
        <% for message in @user.errors.full_messages %>
          <li><%= message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>
  <div class="field">
    <%= f.label :password %>
    <%= f.password_field :password %>
  </div>
  <div class="field">
    <%= f.label :password_confirmation %>
    <%= f.password_field :password_confirmation %>
  </div>
  <div class="actions"><%= f.submit "Update Password" %></div>
<% end %>

The error is :First argument in form cannot contain nil or be empty

I'm assuming that @user is empty, I'm new on RoR and I don't know why I get this error

Password Controller

class PasswordResetsController < ApplicationController
  def new
    render :layout => false
  end
  def create

    user = User.find_by_email(params[:email])
    user.send_password_reset if user
    redirect_to :connect, :notice => "An E-mail has been send"
  end
  def edit
    render :layout => false
    @user = User.find_by_password_reset_token!(params[:id])
  end
  def update
  @user = User.find_by_password_reset_token!(params[:id])
  if @user.password_reset_sent_at < 2.hours.ago
    redirect_to new_password_reset_path, :alert => "Password &crarr; 
      reset has expired."
  elsif @user.update_attributes(params[:user])
    redirect_to root_url, :notice => "Password has been reset."
  else
    render :edit
  end
end
end
3

There are 3 best solutions below

3
On BEST ANSWER

Change your def edit to

def edit
  @user = User.find_by_password_reset_token!(params[:id])
  render :layout => false

end
1
On

This is the answer to '@user.update_attributes(params[:user])' with forbidden attributes error.

Rails 4 has new feature known as strong parameters. Change your password controller to:

class PasswordResetsController < ApplicationController
  def new
    render :layout => false
  end
  def create

    user = User.find_by_email(params[:email])
    user.send_password_reset if user
    redirect_to :connect, :notice => "An E-mail has been send"
  end
  def edit 
    @user = User.find_by_password_reset_token!(params[:id])
    render :layout => false
  end
  def update
  @user = User.find_by_password_reset_token!(params[:id])
  if @user.password_reset_sent_at < 2.hours.ago
    redirect_to new_password_reset_path, :alert => "Password &crarr; 
      reset has expired."
  elsif @user.update_attributes(user_params)
    redirect_to root_url, :notice => "Password has been reset."
  else
    render :edit
  end
end


  private

  def user_params
    params.require(:user).permit(:name, :email_id, :password)
  end

end
2
On

you have to add

@user = User.new

to your new method.

you have also another error for your create method. there is no user creation.

class PasswordResetsController < ApplicationController
  def new
    @user = User.new
    render :layout => false
  end

  def create
    @user = User.new user_params
    if @user.save
      # your code to render success
    else
      # your code to render error
    end
  end

  private

  def user_params
    params.require(:user).permit(:email) # add more
  end
end