Rails - param丢失或值为空:user

时间:2015-07-08 17:43:49

标签: ruby-on-rails ruby

我一直在开发一个基于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没有被传入,但我不明白为什么。

1 个答案:

答案 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方法。