Связывание (has_one) нескольких моделей в форме - PullRequest
1 голос
/ 10 февраля 2011

Я не могу связать внешний ключ перед сохранением данных (поле 'user_id' для сетевой модели пусто при сохранении в базе данных).Я новичок в RoR, поэтому, пожалуйста, извините, если мой код небрежный: -)

Модели:

class Network < ActiveRecord::Base
  belongs_to :user
end


class User < ActiveRecord::Base
has_one  :network, :foreign_key => "user_id",
                   :dependent => :destroy

Контроллер:

class UsersController < ApplicationController
def new
  @user = User.new
  @network = @user.build_network
  @title = "Sign Up"
end

def create
  @user = User.new(params[:user])
  if (@user.save)
    @network = Network.new(params[:network])
    if (@network.save)
      sign_in @user
      flash[:success] = "Welcome!"
      redirect_to @user
    else
      @title = "Sign up"
      render 'new'
    end
  else
    @title = "Sign up"
    render 'new'
  end
end

Я могу получить весь пользовательский ввод из представления без проблем (используя form_for и fields_for).Должен ли я явно определять связь has_one в дополнение к использованию @ user.build_network?

В соответствии с предложением использовать accepts_nested_attributes_for, я очистил свой контроллер до

def new
  @user = User.new
  @user.build_network
  @title = "Sign Up"
end

def create
  @user = User.new(params[:user])
  if (@user.save)
    sign_in @user
    flash[:success] = "Welcome!"
    redirect_to @user        
  else
    @title = "Sign up"
    render 'new'
  end
end

обновлена ​​ассоциация в пользовательской модели:

has_one  :network, :class_name => 'Network',
         :foreign_key => "user_id",
         :dependent => :destroy

accepts_nested_attributes_for :network,
                              :reject_if => :all_blank,
                              :allow_destroy => true

Однако все атрибуты network_attributes остаются пустыми, когда я отправляю форму.Я следовал инструкциям в предоставленных ссылках, а также http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes (и многим другим)

Я не думаю, что это проблема с представлением / формой, так как я могу получить доступ катрибуты, использующие Network.new(params[:network]

Есть мысли / предложения?

Ответы [ 2 ]

3 голосов
/ 10 февраля 2011

Это идеальная ситуация для использования accepts_nested_attributes_for

Взгляните на http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html, а также http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for, чтобы увидеть, как вы можете легко реализовать это с помощью form_for


(обновление после вопроса)

Если вы можете получить доступ к атрибутам от Network до params[:network], то вы (к сожалению!) Пропустили одну из более тонких частейвложенных атрибутов, которые являются вызовом fields_for

Я предполагаю, что у вас есть что-то вроде следующего (используя синтаксис HAML для скорости):

= form_for @user do |f|
  = f.text_field :name
  = f.text_field :email_address

  - fields_for @network do |n|
    = n.text_field :name

ПроблемаЭто означает, что Rails не видит явной связи в форме между вашими полями User и Network.(Это умно, но не , что умно)

То, как вы явно заявляете, что Network вложено в User (для обновления вложенных атрибутов необходимо убедиться, что вы вызываетефункция fields_for @network в конструкторе форм User, а не сама по себе:

= form_for @user do |f|
  = f.text_field :name
  = f.text_field :email_address

  - f.fields_for @network do |n|
    = n.text_field :name

Таким образом, когда вы отправляете форму и проверяете params, вы заметитечто у вас есть и params[:user], и params[:user][:network] - которые Rails распознает как вложенные атрибуты, и должен затем сохранить их и связать их вместе.

2 голосов
/ 10 февраля 2011

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

attr_accessible :name, :age, :network_attributes, ...

Обратите внимание, что вам также нужно будет поставить все атрибутыВы хотите «массовое назначение» в списке, как: name и: age в приведенном выше примере.

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