2013-08-02 11 views
11

मैं RoR के लिए नया हूं और इस तैयार समस्या से फंस गया हूं। मैं उपयोगकर्ताओं को ईमेल या उपयोगकर्ता नाम से साइन इन करने की अनुमति देना चाहता हूं (उपयोगकर्ता नाम के साथ पंजीकरण पहले से ही ठीक है)। Article 1 और Article 2 और आप नीचे दिए गए परिणाम देख सकते हैं:रेल 4 + देवता ईमेल या उपयोगकर्ता नाम और मजबूत पैरामीटर के साथ लॉगिन

application_controller.rb

class ApplicationController < ActionController::Base 
    protect_from_forgery with: :exception 
    before_filter :configure_permitted_parameters, if: :devise_controller? 

    protected 

    def configure_permitted_parameters 
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :password) } 
    devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:login, :password, :remember_me) } 
    end 
end 

user.rb

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :authentication_keys => [:login] 

    validates_uniqueness_of :username 
    validates_presence_of :username 
    validates :username, length: { in: 4..20 } 

    def self.find_first_by_auth_conditions(warden_conditions) 
    conditions = warden_conditions.dup 
    if login = conditions.delete(:login) 
     where(conditions).where(["lower(username) = :value OR lower(email) = :value", { :value => login.downcase }]).first 
    else 
     where(conditions).first 
    end 
    end  
end 

new.html.erb

मैं इन लेखों का पालन किया

<%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %> 
    <div><%= f.label :login, "Pseudo ou email" %><br /> 
    <%= f.text_field :login, :autofocus => true %></div> 
... 

devise.rb

... config.authentication_keys = [: लॉगिन] ...

परिणाम

Showing /home/action/workspace/rchq/app/views/devise/sessions/new.html.erb where line #5 raised: 

undefined method `login' for #<User:0x000000033996a0> 

मुझे समझ नहीं आता क्यों यह क्योंकि काम नहीं करता है मैंने निर्दिष्ट किया कि "sign_in" परमिट के लिए: उपयोगकर्ता के लिए लॉगिन करें।

उत्तर

8

समस्या क्षेत्र के साथ है "लॉगिन", :authentication_keys => [:login] को हटा दें और अपने User मॉडल में attr_accessor :login जोड़ें।

+2

आपको बहुत धन्यवाद, यह सिर्फ attr_accessor जोड़कर काम करता है: लॉगिन! मैंने सोचा कि "attr_accessor" को रेल मानकों के बाद मजबूत पैरामीटर द्वारा प्रतिस्थापित किया गया था। – Dragu

+0

नहीं, attr_accessible को बहिष्कृत किया गया है। यहां और अधिक है: http://stackoverflow.com/questions/3136420/difference-between-attr-accessor-and-attr-accessible – rb512

+0

@Dragu 'attr_accessible' को मजबूत पैरामीटर द्वारा प्रतिस्थापित किया गया था। 'attr_accessor' इस मामले में, 'login'' सेटटर/गेटर विधियों को बनाता है। यह '@ login' का एक इंस्टेंस वैरिएबल भी बना रहा है – scarver2

संबंधित मुद्दे