空参数 - 形式
Empty argument - form for
我想实现重设密码功能,所以我遵循了 this railscast,我收到带有 link 的邮件以重定向到编辑密码页面,但我在这里收到错误消息。
查看
<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 ↵
reset has expired."
elsif @user.update_attributes(params[:user])
redirect_to root_url, :notice => "Password has been reset."
else
render :edit
end
end
end
将您的 def 编辑更改为
def edit
@user = User.find_by_password_reset_token!(params[:id])
render :layout => false
end
你必须添加
@user = User.new
你的新方法。
您的创建方法还有另一个错误。没有创建用户。
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
这是对“@user.update_attributes(params[:user])”的回答,其中包含禁止属性错误。
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 ↵
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
我想实现重设密码功能,所以我遵循了 this railscast,我收到带有 link 的邮件以重定向到编辑密码页面,但我在这里收到错误消息。
查看
<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 ↵
reset has expired."
elsif @user.update_attributes(params[:user])
redirect_to root_url, :notice => "Password has been reset."
else
render :edit
end
end
end
将您的 def 编辑更改为
def edit
@user = User.find_by_password_reset_token!(params[:id])
render :layout => false
end
你必须添加
@user = User.new
你的新方法。
您的创建方法还有另一个错误。没有创建用户。
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
这是对“@user.update_attributes(params[:user])”的回答,其中包含禁止属性错误。
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 ↵
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