2014-07-06 57 views
1

我有,當我試圖用戶params.require(......)的故障許可證(...)如何創建rails參數?

在我的應用程序收到後續PARAM DIC:

{"utf8"=>"✓", 
"authenticity_token"=>"Vatzcb5tgTu2+wL1t6Of+FbIK8Ibp+tM03Naai4b2OU=", 
"/login"=>{"username_or_email"=>"jonatasteixeira", 
"password"=>"[FILTERED]"}, 
"commit"=>"Save /login" } 

我想知道爲什麼我的密鑰收到「/登錄」名稱。

我的觀點:

<h1>Login</h1> 

<%= form_for(login_path) do |f| %> 
    <div class="field"> 
    <%= f.label :username_or_email %><br> 
    <%= f.text_field :username_or_email %> 
    </div> 
    <div class="field"> 
    <%= f.label :password %><br> 
    <%= f.password_field :password %> 
    </div> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

<%= link_to 'Back', root_path %> 

在我的控制器

class SessionsController < ApplicationController 

    # GET /login 
    def new 
    @user = User.new 
    end 

    # POST /login 
    def create 
    @user = User.find_by_emai(session_params[:username_or_email]) || User.find_by_username(session_params[:username_or_email]) 
     if @user && @user.authenticate(session_params[:password]) 
     session[:current_user_id] = @user.id 
     flash[:notice] = 'You are logged in' 
     else 
     flash[:notice] = 'Invalid password, username or email' 
     end 
    end 

    private 
    # Never trust parameters from the scary internet, only allow the white list through. 
    def session_params 
     logger.info :login 
     params.require("/login").permit(:username_or_email, :password) 
    end 
end 

我不想使用 「/登錄」 作爲關鍵,我想用:登錄。有人知道我怎麼調整它?

謝謝!

回答

2

由於@Rafal指出的那樣,你可以編寫你到form_for這樣的呼籲擺脫尷尬/login關鍵的你參數:

<%= form_for(:login) do |f| %> 

強參數確實只適用於您在對象上進行批量分配的場景。例如,如果你是創建用戶,那麼你可能想要使用強參數將屬性傳遞給new初始值設定項方法。

@user = User.new(session_params) 

但因爲你不是在這種情況下做的質量分配,你可以通過在值的情況下直接一個session_params方法:

# POST /login 
def create 
    @user = User.find_by(email: params[:login][:username_or_email]) || User.find_by(username: params[:login][:username_or_email]) 
    if @user && @user.authenticate(params[:login][:password]) 
    session[:current_user_id] = @user.id 
    flash[:notice] = 'You are logged in' 
    else 
    flash[:notice] = 'Invalid password, username or email' 
    end 
end 

的強烈參數的整點,所以沒有人可以傳入額外的屬性。在您的/login方案中,您的代碼完全控制了正在處理的值,因此您無需擔心。

+0

行..我做了這個調整,但是。我得到這個錯誤:「參數丟失或值是空的:登錄」 – JonatasTeixeira

+0

如果您重新加載窗體並檢查其中一個字段,它是否看起來像這樣? '' –

+0

P.S.你應該在Rails 4中使用'find_by(email:...)'和'find_by(username:...)'。我認爲像find_by_email和find_by_username這樣的動態查找器在版本4中是不推薦使用的。 –

0

而不是

<%= form_for(login_path) do |f| %>

使用

<%= form_for(:login) do |f| %>

+0

我做到了,但它沒有解決我的麻煩,參數仍然是等於! – JonatasTeixeira

1

Form_For

當您使用form_for,Rails的期望一個object傳遞,因此它可以從它建立了各種不同的元素:

[The form_for] helper is designed to make working with resources much easier compared to using vanilla HTML.

問題是你傳遞的路線來這種方法,我很驚訝實際上有效。

-

form_tag

你會得到更好的使用symbol的建議,接受的答案,或者通過使用form_tag,不需要的對象:

<%= form_tag login_path do %> 
    <%= text_field_tag :username_or_email %> 
    <%= password_field_tag :password %> 
    <%= submit_button_tag "Go" %> 
<% end %> 

這將刪除對你的參數的「登錄」鍵的引用,並會給你這樣做的能力(不需要require):

params.permit(:username_or_email, :password)