2012-02-08 3 views
2

Я заметил, что созданные атрибуты Resouce все заготовки после выполнения build_resource в Devise::RegistrationsController создать функциюрельсы 3.1, почему devise не может построить ресурс?

здесь объект PARAMS отправлено:

"student"=>{"first_name"=>"George", 
"last_name"=>"Michle", 
"company_name"=>"Meri", 
"work_title"=>"Architect", 
"address"=>"Moon", 
"postal_code"=>"23410", 
"work_phone"=>"", 
"home_phone"=>"", 
"mobile_phone"=>"", 
"fax"=>"", 
"email"=>"[email protected]", 
"password"=>"[FILTERED]", 
"password_confirmation"=>"[FILTERED]", 
"country_id"=>"2", 
"state_province_id"=>"2"} 

Вот приведённый ресурс атрибуты:

[["address", ""], ["city", nil], ["company_name", ""], ["country_id", 1], ["created_at", Wed, 08 Feb 2012 04:52:35 UTC +00:00], ["current_sign_in_at", nil], ["current_sign_in_ip", nil], ["email", ""], ["encrypted_password", ""], ["fax", ""], ["first_name", ""], ["home_phone", ""], ["last_name", ""], ["last_sign_in_at", nil], ["last_sign_in_ip", nil], ["license_number", nil], ["mobile_phone", ""], ["postal_code", ""], ["remember_created_at", nil], ["reset_password_sent_at", nil], ["reset_password_token", nil], ["sign_in_count", 0], ["state_province_id", nil], ["updated_at", Wed, 08 Feb 2012 04:52:35 UTC +00:00], ["username", nil], ["work_phone", ""], ["work_title", ""]] 

Итак, почему build_resource не смог заполнить параметры? Где искать эту проблему? Любая помощь будет более чем оценена.

EDIT:

Вот модель студента:

class Student < ActiveRecord::Base 

    has_many :students_courseses 
    has_many :courses , :through => :students_courseses 



    # Include default devise modules. Others available are: 
    # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, :timeoutable 

    belongs_to :country 
    #validates :weburl, :url => {:allow_blank => true}, :length => { :maximum => 50 } 

    validates_length_of :work_phone, :is => 10, :message => 'must be 10 digits, excluding special characters such as spaces and dashes. No extension or country code allowed.', :if => Proc.new{|o| !o.work_phone.blank?} 
    validates_length_of :home_phone, :is => 10, :message => 'must be 10 digits, excluding special characters such as spaces and dashes. No extension or country code allowed.', :if => Proc.new{|o| !o.home_phone.blank?} 
    validates_length_of :mobile_phone, :is => 10, :message => 'must be 10 digits, excluding special characters such as spaces and dashes. No extension or country code allowed.', :if => Proc.new{|o| !o.mobile_phone.blank?} 
    validates_length_of :fax, :is => 10, :message => 'must be 10 digits, excluding special characters such as spaces and dashes. No extension or country code allowed.', :if => Proc.new{|o| !o.fax.blank?} 

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :email, :password, :password_confirmation, :remember_me 

    attr_accessible:username 
    attr_accessible:first_name 
    attr_accessible:last_name 
    attr_accessible:address 
    attr_accessible :city 

    attr_accessible :state_province_id 
    attr_accessible :country_id 

    attr_accessible:postal_code 
    attr_accessible:work_phone 
    attr_accessible:home_phone 
    attr_accessible:mobile_phone 
    attr_accessible:fax 

    attr_accessible:company_name 
    attr_accessible:work_title 
    attr_accessible:license_number 

    ############################################################### 


    #attr_accessor can be used for values you don't want to store in the database directly and that will only exist for the life of the object (e.g. passwords). 
    attr_accessor :email, :password, :password_confirmation, :remember_me 
    ############################################################### 


    cattr_accessor :time_out_time 

    def timeout_in 
    if time_out_time.nil? 
     STUDENT_LOG_OUT_PERIOD 
    else 
     time_out_time.seconds 
    end 
    end 
end 

студент модель маршрута файла:

devise_for :students, :controllers => { :registrations => "students/registrations" } 
    devise_for :students, :controllers => { :sessions => "students/sessions" } 

EDIT2:

Здесь т он регистрация студент контроллер:

class Students::RegistrationsController < Devise::RegistrationsController 

    def update 
    # no mass assignment for country_id, we do it manually 
    # check for existence of the country in case a malicious user manipulates the params (fails silently) 
    if student_signed_in? then 
     if params[resource_name][:country_id] 
     resource['country_id'] = params[resource_name][:country_id] if Country.find_by_id(params[resource_name][:country_id]) 
     end 
     if params[resource_name][:state_province_id] 
     resource.state_province_id = params[resource_name][:state_province_id] if State.find_by_id(params[resource_name][:state_province_id]) 
     end 
    end 
    super 
    end 

    def create 
    super 
    end 

end 
+0

Пожалуйста, добавьте код, который показывает вызов метода 'build_resource'. – Thilo

+0

его метод создания Devise :: RegistrationsController, который вызывается, когда пользователь отправляет новую пользовательскую форму. – simo

+0

. Таким образом, вы не используете регистрационный_управление Devise, но ваш собственный. Отправьте этот код тоже. – Thilo

ответ

1

если удалить эту строку из моей студенческой модели:

attr_accessor :email, :password, :password_confirmation, :remember_me 

каждая вещь отлично работает !, я не должен добавить attr_accessor, если добавить его, изобрести не сможет создать новый ресурс от отправленных параметров.

+0

Зачем нужен удаление? –

+0

Прошу прощения, я ответил на этот вопрос год назад. – simo

+0

Мне интересно узнать, почему devise хочет удалить attr_accessors. –

1

Ну, метод build_resource выглядит следующим образом:

def build_resource(hash=nil) 
    hash ||= params[resource_name] || {} 
    self.resource = resource_class.new_with_session(hash, session) 
end 

Так что, похоже, что возвращается ресурс, построенный из пустого хэша, который, в свою очередь, может указывать на вопрос об именовании , Отправьте соответствующий раздел из файла маршрутов, пожалуйста, и модель Студента (части devise: и devise_for).

+0

Спасибо, Тило, к сожалению, у меня есть код дома, как только я вернусь домой, я отправлю код, который вам нужен, но как я могу предупредить вас тогда ? – simo

+0

Просто добавьте еще один комментарий, когда вы это сделали. – Thilo

+0

Пожалуйста, ознакомьтесь с РЕДАКТОМ выше, обратите внимание, что проверки на стороне клиента не работают при отправке формы, я надеюсь, что это поможет. – simo

16

У меня была аналогичная проблема. В моем методе создания build_resource не взял данные параметры и регистрация не удалась. ->Email не может быть пустым сообщение

Проблема заключалась в том, что я использую Разрабатывают 3,0 и работал для меня:

build_resource sign_up_params 

< Разрабатывают 3.0 работает без sign_up_params довольно хорошо

+0

Метод 'build_resource' стал менее волшебным после 3.x - ранее он выбрал 'params [resource_name]' как хэш по умолчанию для предоставления ресурса. – ocodo

+0

Просто отправка параметров не будет работать, вам нужно указать имя ресурса явно .... Скажите для модели с именем Student, build_resource params [: student] отправит параметры. @ Chriz благодарит товарища по тонне ... Я сидел с этой проблемой за 4 часа подряд, наконец, получил ответ здесь ... –