2014-07-06 4 views
1

Je vais avoir un problème quand je suis en train de params.require utilisateur (...) permis (...)Comment les rails params sont-ils créés?

Dans ma demande, j'ai reçu le suivi dic param.

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

Je voudrais savoir pourquoi la clé my a reçu le nom "/ login".

Mon point de vue:

<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 %> 

Dans mon contrôleur

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 

Je ne veux pas utiliser "/ login" comme la clé, je voudrais utiliser: connexion. Quelqu'un sait comment je pourrais l'ajuster?

Merci!

Répondre

2

Comme @Rafal souligné, vous pourriez coder votre appel à form_for comme celui-ci pour se débarrasser de la clé /login maladroit dans votre params:

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

Les paramètres forts ne sont réellement valables que pour les scénarios dans lesquels vous effectuez une affectation de masse sur un objet. Si vous étiez en créant l'utilisateur, par exemple, alors vous voudriez probablement passer les attributs dans la méthode d'initialisation new en utilisant des paramètres forts.

@user = User.new(session_params) 

Mais parce que vous ne faites pas l'affectation de masse dans ce cas, vous pouvez simplement passer les valeurs directement sans méthode 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 

Le point de l'ensemble des paramètres forts est donc pas un peut transmettre des attributs supplémentaires. Dans votre scénario /login, votre code contrôle complètement les valeurs traitées, vous n'avez donc pas besoin de vous en préoccuper.

+0

OK .. Je l'ai fait ajuste mais. Je reçois cette erreur: "param est manquant ou la valeur est vide: login" – JonatasTeixeira

+0

Si vous rechargez le formulaire et inspectez l'un des champs, cela ressemble-t-il à ceci? '' –

+0

P.S. Vous devriez utiliser 'find_by (email: ...)' et 'find_by (nom d'utilisateur: ...)' dans Rails 4. Je pense que les finders dynamiques comme 'find_by_email' et' find_by_username' sont obsolètes dans la version 4. –

0

Au lieu de

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

utilisation

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

+0

Je l'ai fait, mais ce n'est pas réparer mon problème, le params reste iqual! – JonatasTeixeira

1

Form_For

Lorsque vous utilisez form_for, Rails attend un object à passer il peut construire une variété de différents éléments de celui-ci:

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

Le problème est vous passez une route vers cette méthode, dont je suis surpris fonctionne réellement.

-

form_tag

Vous serez mieux à l'aide d'un symbol, tel que recommandé par la réponse acceptée, ou à l'aide form_tag, qui ne nécessite pas un objet:

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

Cela va supprimer les références à la clé "login" de vos paramètres, et vous donnera la possibilité de le faire (pas besoin de require):

params.permit(:username_or_email, :password)