fatherdamo
fatherdamo

Reputation: 175

How do you use simple_fields_for with associated models?

I have two models, Wines that has_one :register and Registers that belong_to :wine. The registers_controller.rb is straightforward, produced by rails generate scaffold.

I want to create a register object at the same time as a wine object and to ensure they are linked correctly. I am therefore trying to do this within the same form.

I am using simple_form_for and simple_fields_for and I believe the latter is being executed but there is no instance of register and so the form does not include the fields for completion.

I think the relevant code snippets are:

From wines_controller.rb

def new
  @wine = Wine.new
  @wine.register = Register.new
end
def create
  @wine = Wine.new(wine_params)
  @wine.register.build
  # error checking code
end 
def wine_params
  params.require(:wine).permit(:name, :cuvee, register_attributes: [:id, :short_name])

From wines\_form.html.erb

<%= simple_form_for @wine do |f| %>
<div class="field">
  <%= f.label :name %>
  <%= f.text_field :name %>
</div>
<% f.simple_fields_for :register do |r| %>
  <%= r.label :short_name %>
  <%= r.input :short_name %> 
<% end %>
</div>

I have tried various different codes within def create and def new methods including (in def create) @wine.register.build = Register.new(register_params) and @wine.register.build in def new.

What am I doing wrong? Clearly, when I need to create one object the second needs to be instantiated in order for simple_fields_for to produce input areas.

Upvotes: 0

Views: 3174

Answers (2)

Vincent Rolea
Vincent Rolea

Reputation: 1663

In your Wine model:

class Wine
  has_one :register
  accepts_nested_attributes_for :register
end

In your Wine controller define the following new action:

def new
  @wine = Wine.new
  @register = @wine.build_register
end

In your view:

<%= simple_form_for @wine do |w| %>
  <%= w.input: :name %>
  <%= w.simple_fields_for :register do |r| %>
    <%= r.input :short_name %>
  <% end %>
<% end %>

Upvotes: 3

angkiki
angkiki

Reputation: 495

Try doing Wine.build_register instead. Like this:

def create
  @wine = Wine.new(wine_params)
  @wine = @wine.build_register
  #other code
end

Upvotes: 1

Related Questions