【发布时间】:2015-07-09 01:52:24
【问题描述】:
我一直在根据 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 %>
当我点击“密码重置”链接时,出现以下错误:
用户控制器中的 ActionController::ParameterMissing#passreset
参数缺失或值为空:用户
我的编辑页面仍然可以正常工作。
错误的来源是我的用户控制器参数声明:
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 routes 显示这两行,一行用于编辑,一行用于 passreset:
edit_user GET /users/:id/edit(.:format) users#edit
passreset_user GET /users/:id/passreset(.:format) users#passreset
passreset 方法(除了通知)是 update 方法的精确副本。
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 没有被传入,但我不明白为什么。
【问题讨论】:
-
查看
params并找出其中的内容。这不是你所期望的。您可以在日志中看到这一点,并使用byebug进行交互。鉴于 Rails 附带的工具,这很容易调试。
标签: ruby-on-rails ruby