Rails错过了与河豚的param密码

时间:2014-02-21 15:19:37

标签: ruby-on-rails ruby bcrypt blowfish

我正在使用blowfish gem为我的用户加密密码(user模型)。

模式中的

我不再有password字段,但在rails控制台中我可以(并且必须)运行user.password = "xxx"user.password_confirmation = "xxx"以便能够调用user.save。这适用于rails控制台,但我有一个webform,用户可以在逻辑上编辑他/她的密码。

这是我的edit.html.erb

 <%= form_for(@user) do |f| %>
    <%= render(:partial => "form", :locals => {:f => f}) %> 
    <%= submit_tag("Edit User") %>
 <% end %>

与密码有关的_form.html.erb中的parital是

 <table>
   ...
 <tr>
    <th>Password</th>
    <td><%= f.text_field(:password) %></td>
 </tr>
 <tr>
    <th>Confirm Password</th>
    <td><%= f.text_field(:password_confirmation)%></td>
 </tr>

在我的users_controller.rb我需要login password password_confirmation这样

    def update
       @user = User.find(params[:id])
       @user.update_attributes(user_params)
       if @user.save
         flash[:notice] = "Update Successful"
         redirect_to(:action => 'show', :id => @user.id)
       else
         flash[:notice] = "Error Updating"
         render('edit')
        end  
     end

私有

def user_params
  r = params.require(:user)
  r.require(:login)
  r.require(:password)
  r.require(:password_confirmation)
  r.permit(:first_name, :last_name, :login, :password, :password_confirmation)
end

当我提交完整的表格时,问题不在于更新。问题是,当我将密码字段留空时,不是再次呈现编辑表单,而是给我Action Controller: Exception param not found: password并指向r.require(:password)的{​​{1}}行功能

修改

我评论了两个需要行,并验证模型中是否存在login,password,password_confirmation。但是现在我收到了这个错误

user_params user'for#undefined method @ user.upadte_attributes(user_params)`line。

对于Rails 4中的强参数,我还需要pointing to the然后:user吗?

编辑2 - .permit(.....)

中的更新方法
users_controller.rb

def update @user = User.find(params[:id]) if @user.update_attributes(user_params) flash[:notice] = "Update Successful" redirect_to(user_path(@user.id)) else flash[:notice] = "Error Updating" render('edit') end end    私人

user params

错误讯息:

def user_params
  params.require(:user).permit(:first_name, :last_name, :login, :password, :password_confirmation, :position, :pictureString)
end

修改

进一步的调查显示了这一点:

如果我将undefined method `user' for #<User:0x007f4d482b1af0> Extracted source (around line #36): 34 def update 35 @user = User.find(params[:id]) 36 if @user.update_attributes(user_params) 37 flash[:notice] = "Update Successful" 38 redirect_to(user_path(@user.id)) 39 else app/controllers/users_controller.rb:36:in `update' 退出.permit(....)函数(即只读取user_params),那么我不会得到未定义的方法错误,而是预期的{{1}错误。也许这可以帮助你找到错误。

1 个答案:

答案 0 :(得分:0)

强参数用于表单验证。它们用于安全目的,以替换模型级别使用的attr_accessible宏。

表单验证应该在客户端执行,或者将params传递给执行验证的某个模型(如果认为有效,则会调用update_attributes。)