空参数 - 形式

时间:2015-06-12 07:45:25

标签: ruby-on-rails passwords

我想实现重置密码功能,所以我跟着this railscast,我收到了带有重定向到编辑密码页面的链接的邮件,但是我在这里收到错误。

查看

<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 %>

错误是:First argument in form cannot contain nil or be empty

我假设@user为空,我是RoR的新手,我不知道为什么会出现此错误

密码控制器

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 个答案:

答案 0 :(得分:0)

将您的def编辑更改为

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

end

答案 1 :(得分:0)

你必须添加

@user = User.new

到你的新方法。

您的create方法还有另一个错误。没有用户创建。

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

答案 2 :(得分:0)

这是&#39; @ user.update_attributes(params [:user])&#39;的答案。禁止使用属性错误。

Rails 4具有称为strong parameters的新功能。 将密码控制器更改为:

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