2011-11-30 2 views
2

Utilisation d'une portion d'authentification personnalisée simple pour mon application Ruby on Rails. J'essaie de rendre l'email requis quand l'utilisateur s'enregistre avec l'application mais quand j'essaye le processus d'enregistrement, un enregistrement est créé dans la base de données mais l'email est mis à zéro. Voici un code:Ruby on Rails - Champ défini sur

Mon modèle:

class User < ActiveRecord::Base 
attr_accessor :email, :password, :password_confirmation 
before_save :encrypt 

validates :password, 
      :presence => true, 
      :confirmation => true 
validates :email, 
     :presence => true, 
     :uniqueness => true, 
     :format => { :with => /^[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,}\z$/ } 

def encrypt 
    if password.present? 
    self.password_salt = BCrypt::Engine.generate_salt 
    self.password_hash = BCrypt::Engine.hash_secret(password, password_salt) 
    end 
end 

def self.authenticate(email, password) 
    user = find_by_email(email) 
    if user && user.password_hash = BCrypt::Engine.hash_secret(password, user.password_salt) 
    user 
    else 
    nil 
    end 
end 
end 

Mon contrôleur:

class UsersController < ApplicationController 
    skip_filter :login_required, :only => [:create, :new] 

    def new 
    @user = User.new 
    render :layout => 'unauthenticated' 
    end 

    def create 
    @user = User.new(params[:user]) 
    @user.last_login = DateTime.now 
    @user.is_active = true 

    if @user.save 
     session[:user_id] = @user.id 

     redirect_to root_url 
    else 
     render :action => :new 
    end 
    end 

end 

La vue:

<div id="register"> 
    <%= form_for @user do |f| %> 
    <% if @user.errors.any? %> 
    <div class="error"> 
     <ul> 
     <% for message in @user.errors.full_messages %> 
     <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 
    <ul> 
     <li> 
     <%= f.label :email %> 
     <%= f.text_field :email %> 
     </li> 
     <li> 
     <%= f.label :password %> 
     <%= f.password_field :password %> 
     </li> 
     <li> 
     <%= f.label :password_confirmation %> 
     <%= f.password_field :password_confirmation %> 
     </li> 
     <li> 
     <%= f.submit 'Register' %> 
     </li> 
    </ul> 
    <% end %> 
</div> 

Pour une raison quelconque l'e-mail se prépare à zéro chaque fois qu'un l'utilisateur est enregistré. Le seul qui ressemble à l'email est le champ sur la vue, et la validation donc je ne sais pas si peut-être que la validation l'efface et qu'aucune erreur n'est levée. La méthode: login_required se trouve dans mon application_controller et est une vérification pour s'assurer que l'utilisateur est connecté à la session. Le skip_filter ne vérifie pas cela lorsque vous accédez aux pages de connexion et d'enregistrement.

Des idées? Merci d'avance.

+0

Inspectez votre variable 'params' au début de la méthode create. –

Répondre

3

Vous avez écrit:

attr_accessor :email, :password, :password_confirmation 

Avez-vous essayé de supprimer le paramètre de messagerie de cette liste? Il surpasse probablement la persistance d'AR pour l'attribut email. Vous pouvez vouloir attr_accessible à la place pour l'email.

+0

C'est ce qu'il a fait. J'ai enlevé: email de cette liste et cela a fonctionné. Je suis un peu nouveau à Ruby on Rails alors laissez-moi m'assurer que j'ai bien compris. D'après ce que j'ai lu, attr_accessor crée des méthodes get et set pour les champs spécifiés. attr_accessible permet simplement au contrôleur d'accéder à ce champ via le modèle? –

+0

attr_accessor est un raccourci Ruby pour définir les méthodes getter et setter sur n'importe quelle classe pour une variable d'instance (@). ActiveRecord crée automatiquement ceux-ci à partir des attributs de votre modèle afin que vous l'utilisiez rarement. Et oui attr_accessible est une mesure de sécurité de base qui signifie que la variable ne sera pas définie avec update_attributes ou des méthodes similaires. –

+0

Génial, merci pour votre aide. Venant de .Net il y a quelques nuances que j'ai encore besoin d'apprendre pour Ruby. –