2014-08-29 3 views
0

Я, вероятно, отсутствует что-то тривиальное ...Расщепление пользователя и профиля вопрос

У меня есть модель пользователя, что «» HAS_ONE UserProfile:

class User < ActiveRecord::Base 

    before_save { self.email = email.downcase } 
    before_create :create_remember_token 

    has_many :user_roles, dependent: :destroy 
    has_many :roles, through: :user_roles 
    has_one :user_profile, dependent: :destroy 

    accepts_nested_attributes_for :user_roles, :user_profile, allow_destroy: true 

    validates :email, presence: true, format: {with: TextUtils::VALID_EMAIL_REGEX}, uniqueness: {case_sensitive: false} 
    has_secure_password 
    validates :password, length: { minimum: 6 } 

    def User.new_remember_token 
     SecureRandom.urlsafe_base64 
    end 

    def User.digest(token) 
     Digest::SHA1.hexdigest(token.to_s) 
    end 

    def admin? 
     in_role?(Role::ADMINISTRATOR) 
    end 

    def in_role?(role) 
     !self.roles.find_by_name(role).nil? 
    end 

    private 

    def create_remember_token 
     self.remember_token = User.digest(User.new_remember_token) 
    end 
end 

и у меня есть модель UserProfile, что «BELONGS_TO» Пользователь:

class UserProfile < ActiveRecord::Base 
    belongs_to :user 
    has_one :address, dependent: :destroy 
    accepts_nested_attributes_for :address 

    validates :first, :last, :ssn, :title, :division, :phone_home, :phone_mobile, :phone_work, :phone_work_ext, 
    :emergency_phone, :emergency_name, :emergency_relation, presence: true 
    validates :personal_email, format: { with: TextUtils::VALID_EMAIL_REGEX } 
end 

Когда я пытаюсь заполнения базы данных как таковой (или любой другой способ, где профиль присваивается пользователю):

# Admin 
admin = User.create!(email: "[email protected]", password: "secret", password_confirmation: "secret", 
    user_profile: UserProfile.new(
    first: "Admin", 
    last: "User", 
    address_attributes: {line1: "123 Fake Street", line2: "Suite 1", city: "Some City", state: "FL", zip_code: "11111"}, 
    ssn: "123-45-6789", 
    phone_work: "(111) 222-3333", 
    phone_work_ext: "110", 
    personal_email: "[email protected]") 
) 

Я получаю следующее сообщение об ошибке:

 
    rake aborted! 
    ActiveRecord::UnknownAttributeError: unknown attribute: user_profile_id 
    C:/work/Portal/db/seeds.rb:12:in `' 
    Tasks: TOP => db:seed 
    (See full trace by running task with --trace) 

Я в недоумении, почему это происходит. Любая помощь будет оценена! Я использую Rails 4.1.4, если это имеет значение.

ответ

0

Все должно быть передано как (гнездовой) хэша (а):

admin = User.create!({ 
    email: "[email protected]", 
    password: "secret", 
    password_confirmation: "secret", 
    user_profile_attributes: { 
    first: "Admin", 
    last: "User", 
    address_attributes: { 
     line1: "123 Fake Street", 
     line2: "Suite 1", 
     city: "Some City", 
     state: "FL", 
     zip_code: "11111" 
    }, 
    ssn: "123-45-6789", 
    phone_work: "(111) 222-3333", 
    phone_work_ext: "110", 
    personal_email: "[email protected]" 
    } 
}) 

Update

Рабочий пример:

$ rails new testapplication 
     create 
     create README.rdoc 
     create Rakefile 
     create config.ru 
     create .gitignore 
     create Gemfile 
     create app 
     create app/assets/javascripts/application.js 
     create app/assets/stylesheets/application.css 
     create app/controllers/application_controller.rb 
     create app/helpers/application_helper.rb 
     create app/views/layouts/application.html.erb 
     create app/assets/images/.keep 
     create app/mailers/.keep 
     create app/models/.keep 
     create app/controllers/concerns/.keep 
     create app/models/concerns/.keep 
     create bin 
     create bin/bundle 
     create bin/rails 
     create bin/rake 
     create config 
     create config/routes.rb 
     create config/application.rb 
     create config/environment.rb 
     create config/secrets.yml 
     create config/environments 
     create config/environments/development.rb 
     create config/environments/production.rb 
     create config/environments/test.rb 
     create config/initializers 
     create config/initializers/backtrace_silencers.rb 
     create config/initializers/cookies_serializer.rb 
     create config/initializers/filter_parameter_logging.rb 
     create config/initializers/inflections.rb 
     create config/initializers/mime_types.rb 
     create config/initializers/session_store.rb 
     create config/initializers/wrap_parameters.rb 
     create config/locales 
     create config/locales/en.yml 
     create config/boot.rb 
     create config/database.yml 
     create db 
     create db/seeds.rb 
     create lib 
     create lib/tasks 
     create lib/tasks/.keep 
     create lib/assets 
     create lib/assets/.keep 
     create log 
     create log/.keep 
     create public 
     create public/404.html 
     create public/422.html 
     create public/500.html 
     create public/favicon.ico 
     create public/robots.txt 
     create test/fixtures 
     create test/fixtures/.keep 
     create test/controllers 
     create test/controllers/.keep 
     create test/mailers 
     create test/mailers/.keep 
     create test/models 
     create test/models/.keep 
     create test/helpers 
     create test/helpers/.keep 
     create test/integration 
     create test/integration/.keep 
     create test/test_helper.rb 
     create tmp/cache 
     create tmp/cache/assets 
     create vendor/assets/javascripts 
     create vendor/assets/javascripts/.keep 
     create vendor/assets/stylesheets 
     create vendor/assets/stylesheets/.keep 
     run bundle install 


Your user account isn't allowed to install to the system Rubygems. 
You can cancel this installation and run: 

    bundle install --path vendor/bundle 

to install the gems into ./vendor/bundle/, or you can enter your password 
and install the bundled gems to Rubygems using sudo. 

$ cd testapplication/ 
$ bundle install --path vendor/bundle 
Fetching gem metadata from https://rubygems.org/.......... 
Resolving dependencies... 
Installing rake 10.3.2 
Installing i18n 0.6.11 
Using json 1.8.1 
Installing minitest 5.4.1 
Installing thread_safe 0.3.4 
Installing tzinfo 1.2.2 
Installing activesupport 4.1.1 
Installing builder 3.2.2 
Installing erubis 2.7.0 
Installing actionview 4.1.1 
Installing rack 1.5.2 
Installing rack-test 0.6.2 
Installing actionpack 4.1.1 
Installing mime-types 1.25.1 
Installing polyglot 0.3.5 
Installing treetop 1.4.15 
Installing mail 2.5.4 
Installing actionmailer 4.1.1 
Installing activemodel 4.1.1 
Installing arel 5.0.1.20140414130214 
Installing activerecord 4.1.1 
Using bundler 1.6.1 
Installing coffee-script-source 1.8.0 
Installing execjs 2.2.1 
Installing coffee-script 2.3.0 
Installing thor 0.19.1 
Installing railties 4.1.1 
Installing coffee-rails 4.0.1 
Installing hike 1.2.3 
Installing multi_json 1.10.1 
Installing jbuilder 2.1.3 
Installing jquery-rails 3.1.1 
Installing tilt 1.4.1 
Installing sprockets 2.11.0 
Installing sprockets-rails 2.1.3 
Installing rails 4.1.1 
Installing rdoc 4.1.1 
Installing sass 3.2.19 
Installing sass-rails 4.0.3 
Installing sdoc 0.4.1 
Installing spring 1.1.3 
Installing sqlite3 1.3.9 
Installing turbolinks 2.3.0 
Installing uglifier 2.5.3 
Your bundle is complete! 
It was installed into ./vendor/bundle 
Post-install message from rdoc: 
Depending on your version of ruby, you may need to install ruby rdoc/ri data: 

<= 1.8.6 : unsupported 
= 1.8.7 : gem install rdoc-data; rdoc-data --install 
= 1.9.1 : gem install rdoc-data; rdoc-data --install 
>= 1.9.2 : nothing to do! Yay! 

$ ./bin/rails g model user 
     invoke active_record 
     create db/migrate/20140829201904_create_users.rb 
     create app/models/user.rb 
     invoke test_unit 
     create  test/models/user_test.rb 
     create  test/fixtures/users.yml 
$ ./bin/rails g model user_profile user:references test:integer 
     invoke active_record 
     create db/migrate/20140829201916_create_user_profiles.rb 
     create app/models/user_profile.rb 
     invoke test_unit 
     create  test/models/user_profile_test.rb 
     create  test/fixtures/user_profiles.yml 
$ ./bin/rake db:migrate 
== 20140829201904 CreateUsers: migrating ====================================== 
-- create_table(:users) 
    -> 0.0012s 
== 20140829201904 CreateUsers: migrated (0.0013s) ============================= 

== 20140829201916 CreateUserProfiles: migrating =============================== 
-- create_table(:user_profiles) 
    -> 0.0010s 
== 20140829201916 CreateUserProfiles: migrated (0.0010s) ====================== 

Затем редактирует модель пользователя:

class User < ActiveRecord::Base 
    has_one :user_profile 
    accepts_nested_attributes_for :user_profile 
end 

UserProfile al готовы правильно:

class UserProfile < ActiveRecord::Base 
    belongs_to :user 
end 

и запустить оператор создания:

$ ./bin/rails c 
Loading development environment (Rails 4.1.1) 
2.1.0 :001 > User.create({user_profile_attributes: {test: 5}}) 
    (0.1ms) begin transaction 
    SQL (0.5ms) INSERT INTO "users" ("created_at", "updated_at") VALUES (?, ?) [["created_at", "2014-08-29 20:21:41.860036"], ["updated_at", "2014-08-29 20:21:41.860036"]] 
    SQL (0.4ms) INSERT INTO "user_profiles" ("created_at", "test", "updated_at", "user_id") VALUES (?, ?, ?, ?) [["created_at", "2014-08-29 20:21:41.864624"], ["test", 5], ["updated_at", "2014-08-29 20:21:41.864624"], ["user_id", 1]] 
    (1.3ms) commit transaction 
=> #<User id: 1, created_at: "2014-08-29 20:21:41", updated_at: "2014-08-29 20:21:41"> 
2.1.0 :002 > User.last.user_profile.inspect 
    User Load (0.3ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 
    UserProfile Load (0.3ms) SELECT "user_profiles".* FROM "user_profiles" WHERE "user_profiles"."user_id" = ? LIMIT 1 [["user_id", 1]] 
=> "#<UserProfile id: 1, user_id: 1, test: 5, created_at: \"2014-08-29 20:21:41\", updated_at: \"2014-08-29 20:21:41\">" 
+0

Спасибо, GhostGambler. Я пробовал это раньше, и даже сейчас создание не работает с той же ошибкой. Обратите внимание, что я изменил «user_profile:» и «address:» в вашем фрагменте на «user_profile_attributes:» и «address_attributes:» соответственно, иначе вместо хэшей ожидаются реальные объекты. – Vlad

+0

Да, вы правы, ключи были неправильно названы. Но не имеет смысла, что вы получаете то же сообщение об ошибке? Я бы только ожидал этого сообщения об ошибке в двух случаях: либо ваши отношения с моделями неправильны (как вы их написали выше, я не вижу ошибки), либо вы передали объект в метод вместо хэша. – GhostGambler

+0

Я согласен с вами, но это то, что происходит. К сожалению, я застрял. :) – Vlad

Смежные вопросы