edit associated model by input form?

2019-08-23 10:15发布

问题:

Order has_many jobs
Job belongs to order

And I want to edit attributes of @job.order:

<% order = @job.order %>
<%= simple_form_for [@job, order],
  url: job_path(@job),
  method: :put,
  remote: true do |f| %>
    <%= f.input :order_status, input_html: {class: 'form-control'} %>
  (...)
<% end %>

any way to do it by just using input in simple form?

回答1:

in job.rb

accepts_nested_attributes_for :order

in form.html.erb

simple_form_for @job do |f|
  f.simple_fields_for @job.order do |order_form|
    order_form.input :status
  end    
end

in jobs_controller.rb

params.require(:job).permit(:something, :something_else, :order_attributes => [:status])



回答2:

You can use the excellent Cocoon gem https://github.com/nathanvda/cocoon to manage nested relationships, including the ability to easily add new nested relationships.

class Job < ActiveRecord::Base
    has_many :orders
    accepts_nested_attributes_for :orders, reject_if: :all_blank, allow_destroy: true
end

class Order < ActiveRecord::Base
    belongs_to :job
end

Note the pluralization.

_form.html.erb*

<%= form_for @job do |f| %>
  <%= f.label :job_name %>
  <%= f.text_field :name %>
  <div id='order'>
    <%= f.fields_for :orders do |order| %>
       <%= render 'order_fields', f: order %>
    <% end %>
    <div class='links'>
       <%= link_to_add_association 'add order', f, :orders %>
    </div>
   <%= f.submit %>
 <% end %>

_order_fields.html.erb partial

<div class='nested-fields'>
   <%= f.label :order_name %>
   <%= f.text_field :order_name %>
</div>
<%= link_to_remove_association "remove order", f %>