2014-07-06 40 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)