Ruby on Rails Tuesday, July 31, 2012

tl;dr: nested attributes isn't setting the belongs_to association

I have these two models right now:

class Organization < ActiveRecord::Base
  has_many :groups
  belongs_to :main_group, :class_name => Group.name, :foreign_key => :main_group_id, :autosave => true

  validates_presence_of :main_group

  accepts_nested_attributes_for :main_group, :allow_destroy => true
end

class Group < ActiveRecord::Base
  belongs_to :organization, :autosave => true

  validates_presence_of :organization
end

I want to create a nested form that will create a new User along with the Organization along with a new Group. My form code is the following:
<%= form_for(@user) do |f| %>
      <%= f.label :email, "Email Address" %>

      <%= fields_for :organization, @organization do |org_f| %>
        <%= org_f.label :name, "Organization Name" %>
        <%= org_f.text_field :name %>
        <% if org_f.object.new_record? %>
          <%= org_f.fields_for :main_group do |main_f| %>
            <%= main_f.label :name, "Your Org's Main Group" %>
            <%= main_f.text_field :name %>
          <% end %>
        <% end %>
      <% end %>
<% end %>

Here's my Controller's action code that's giving me errors:
  def create
    @user = User.new(params[:user])
    if !params[:secret].to_s.empty?
      @user.accept_invitation(params[:organization][:id], params[:secret])
      @organization = @user.organizations.first || Organization.new
    else
      @organization = @user.organizations.build(params[:organization].slice!(:id))
      @organization.main_group.organization = @organization
    end

  def create
    if !params[:secret].to_s.empty?
      @user.accept_invitation(params[:organization][:id], params[:secret])
      @organization = @user.organizations.first || Organization.new
    else
      @organization = @user.organizations.build(params[:organization].slice!(:id))
      # If I comment out the following line, it'll break
      #  @organization.main_group.organization = @organization
    end
  end

My question is: is there a more elegant way to set the #main_group's association to the organization than the commented line above?

Thanks everyone.

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-talk/-/onfiauXvQ7YJ.
For more options, visit https://groups.google.com/groups/opt_out.
 
 

No comments:

Post a Comment