Возвращаемая модель и связанные полиморфные модели - PullRequest
0 голосов
/ 02 апреля 2011

Я работаю с полиморфными ассоциациями и у меня возникли некоторые проблемы. Мои модели настроены так:

class User < ActiveRecord::Base
    has_one :phone, :as => :callable, :dependent => :destroy
end

class Client < ActiveRecord::Base
    has_one :phone, :as => :callable, :dependent => :destroy
end

class Phone < ActiveRecord::Base
    belongs_to :callable, :polymorphic => true
end

В моем контроллере пользователя

  def create
    @user = User.new(params[:user])
    if @user.save
        @user.phone.create(:area_code => params[:user][:area_code], :phone => params[:user][:phone])
        redirect_to @user, :notice => "Account created successfully!"
    else
      render 'new'
    end
  end

В журнале разработки я вижу, где правильно вставляются телефон и пользователь, но когда я иду к редактированию пользователя, поля для телефона в форме остаются пустыми. Вот мой метод редактирования:

  def edit_employee
    @user = User.find(params[:id])
    @title = "Edit #{@user.name}"
  end

Моя форма редактирования пользователя выглядит следующим образом.

- form_for @user do |f|
  - if @user.errors.any?
    .error_messages
      %h2 Please correct the following errors
      %ul
        - for message in @user.errors.full_messages
          %li= message
%p
  = f.label :name, "Name"
  = f.text_field :name
%p
  = f.label :email, "Email Address"
  = f.text_field :email
%p
  = f.label :phone, "Phone"
  = f.text_field :area_code, :style => "width: 50px;"
  = f.text_field :phone, :style => "width: 100px;"
  = f.label :ext, "Ext."
  = f.text_field :extension, :style => "width: 60px;"
%p
  = f.label :password, "Password"
  = f.password_field :password
%p
  = f.label :password_confirmation, "Confirm Password"
  = f.password_field :password_confirmation
%p.button= f.submit

Я знаю, что должен добавить что-то к этому методу редактирования, возможно

@phone = @user.phone

Но это тоже не сработало. Это первый круг с полиморфными ассоциациями, поэтому любая помощь и указатели очень ценятся. Я смотрел Railscasts по этой теме, но, похоже, он не соответствовал моей основной функциональности. Еще раз, спасибо заранее за любую помощь и дайте мне знать, если требуется дополнительная информация!

Ответы [ 2 ]

0 голосов
/ 03 апреля 2011

Хорошо, я добавил

accepts_nested_attributes_for :phone

в пользовательскую модель.Я также добавил поля для телефона в новой пользовательской форме, например

  %p
    - fields_for @user.phone do |phone|
      = phone.label :phone, "Phone"
      = phone.text_field :area_code, :style => "width: 50px;"
      = phone.text_field :phone, :style => "width: 100px;"
      = phone.label :ext, "Ext."
      = phone.text_field :extension, :style => "width: 60px;"

, но теперь я получаю исключение ActionView :: Template :: Error (неопределенный метод `model_name 'для NilClass: Class).

И да, в моей модели есть attr_accessible.Я просто разместил здесь очень разбавленную версию.

0 голосов
/ 03 апреля 2011

вы должны изучить использование fields_for и nested_attributes.http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

У вас установлен атрибут attr_accessible в модели user.rb?Если нет, я бы добавил его, потому что это проблема безопасности.

...