我一直在开发一个基于Hartl指南的网站。我想将密码重置功能移动到它自己的部分。
我创建了一个部分的_passreset.html.erb。目前,它是_form.html.erb的精确副本。我打算将其编辑为只有密码字段
在用户show.html.erb页面(个人资料页面)上,我有编辑和密码重置的链接。这是代码:
<% if current_user.admin? || current_user == @user %>
<%= link_to "Edit", edit_user_path(@user) %> |
<%= link_to "Password Reset", passreset_user_path(@user)%>
<% end %>
当我点击“密码重设”链接时,出现以下错误:
UsersController中的ActionController :: ParameterMissing #passreset
param丢失或值为空:user
我的编辑页面仍然完美无缺。
错误的来源是我的用户控制器参数语句:
def user_params
params.require(:user).permit(:name, :email, :password, :password_confirmation, :admin)
end
应用程序跟踪说:
app/controllers/users_controller.rb:89:in `user_params'
app/controllers/users_controller.rb:29:in `block in passreset'
app/controllers/users_controller.rb:28:in `passreset'
新功能的路线如下所示:
resources :users do
resources :articles
get 'passreset'
end
rake路由显示这两行,一行用于编辑,一行用于passreset:
edit_user GET /users/:id/edit(.:format) users#edit
passreset_user GET /users/:id/passreset(.:format) users#passreset
passreset方法是(除了通知之外)更新方法的精确副本。
def passreset
respond_to do |format|
if @user.update(user_params)
format.html { redirect_to @user, notice: 'Password was successfully updated.' }
format.json { render :show, status: :ok, location: @user }
else
format.html { render :edit }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
看起来@user没有被传入,但我不明白为什么。
答案 0 :(得分:1)
passreset_user_path(@user)
不会将用户“传入”相关方法,而是会生成一个网址。该URL将包含ID段。它看起来像这样:
/users/123/passreset
将使用params[:id]
中提供的ID细分来调用您的操作。您可以在数据库中找到相应的用户。
您需要按照params[:user]
@user = User.find(params[:id])
。
更大的问题是您的passreset
行为毫无意义。它似乎设置为接收包含用户新属性的POST请求,但是您使用一个按钮链接到该请求,该按钮将生成没有用户属性负载的GET请求。
您错过了整个中间步骤,向用户显示密码重置表单。您的第一个请求需要提供该表单,然后该表单可以POST回您的passreset
方法。