Reputation: 175
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
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
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