【问题标题】:Rails - param is missing or the value is empty: userRails - 参数丢失或值为空:用户
【发布时间】: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


【解决方案1】:

passreset_user_path(@user) 不会将用户“传入”到相关方法中,它会生成一个 URL。该 URL 将包含一个 ID 段。它看起来像这样:

/users/123/passreset

将使用params[:id] 中可用的 ID 段调用您的操作。由您在数据库中找到相应的用户。

您需要按照@user = User.find(params[:id]) 的方式做一些事情,而不是依赖params[:user]

更大的问题是您的passreset 操作毫无意义。它似乎已设置为接收包含用户新属性的 POST 请求,但您使用一个按钮链接到它,该按钮将生成一个没有用户属性有效负载的 GET 请求。

您缺少一个完整的中间步骤,即向用户显示密码重置表单。您的第一个请求需要提供该表单,然后该表单可以 POST 回您的 passreset 方法。

【讨论】:

  • 优秀的答案。谢谢你。我只是删除了 passreset 操作的内容,它立即生效。
猜你喜欢
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多