2014-02-21 67 views
0

我正在使用blowfish gem爲我的用戶加密密碼(user模型)。Rails用blowfish丟失參數密碼

模式中的我沒有password場了,但在軌道控制檯我可以(而且必須),以便能夠調用user.save運行user.password = "xxx"user.password_confirmation = "xxx"。這在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: Exceptionparam not found: password並指向r.require(:password)user_params功能

編輯

我評論這兩個要求的行並驗證模型中是否存在登錄名,密碼,password_confirmation。但是現在我得到這個錯誤

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

我仍然需要:user然後.permit(.....)爲Rails 4中的強參數吧?

EDIT 2 - 在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功能(即它只讀params[:user]),那麼我沒有得到未定義的方法錯誤,但預期的forbidden attributes錯誤。也許這可以幫助你找到問題所在。

+0

你得到的錯誤,因爲這一行:'r.require(:password)' - 所以當然如果它是空的,你會得到這個消息。如果您嘗試驗證是否存在密碼屬性,則應在模型中完成。 – veritas1

+0

謝謝,我正在關注的教程把需求放在控制器中,而不是模型 – Killerpixler

+0

酷,所以你已經回答了你自己的問題。 – veritas1

回答

0

強參數是而不是用於表單驗證。它們是爲了安全目的而取代在模型級別使用的宏attr_accessible

表單驗證既可以在客戶端執行,也可以通過將參數傳遞給執行驗證的某個模型(如果認爲有效,則會調用update_attributes)。

+0

驗證在模型中......問題是爲什麼params.require.permit不再工作了......它是否與RESTful路由有關? – Killerpixler

+0

請發佈完整的stacktrace錯誤信息(或者更新已發佈的代碼) - 未定義的方法'user''不能從您發佈的代碼中提取,因爲您沒有在代碼中的任何地方調用'user' 。 – PinnyM

+0

我發佈了錯誤消息。我認爲這可能與RESTful路由有關,因爲我在一段時間內沒有改變這些行,並且他們總是習慣於工作。我只是無法弄清楚錯誤意味着什麼......我沒有看到'用戶'用作任何地方的方法 – Killerpixler