Rails acceptpts_nested_attributes_for возвращает значения для обновленных / вставленных потомков - PullRequest
2 голосов
/ 21 апреля 2011

Я новичок в переполнении стека. Пожалуйста, будь милостив; -)

У меня есть простая ассоциация has_many с accepts_nested_attributes_for. Все отлично работает Но мне действительно нужны возвращаемые значения для обновленных и / или вставленных дочерних элементов, потому что я отправляю форму в соответствии с Ajax и мне нужно манипулировать только полями формы этих дочерних элементов после успешной отправки / размещения.

EDIT:

Модель:

class Pirate < ActiveRecord::Base
  has_many :ships
  accepts_nested_attributes_for :ships, :reject_if => proc { |a| a[:name].blank? }, :allow_destroy => true
end

class Ship < ActiveRecord::Base
  belongs_to :pirate
end

Контроллер:

def new
  @pirate = Pirate.new
  4.times { @pirate.ships.build }
end

def edit
  @pirate = Pirate.find(params[:id])
end

def create
  @pirate = Pirate.new(params[:pirate])

  respond_to do |format|
    if @pirate.save
      format.js
    else
      format.js
    end
  end
end

def update
  @pirate = Pirate.find(params[:id])

  respond_to do |format|
    if @pirate.update_attributes(params[:pirate])
      format.js
    else
      format.js
    end
  end
end

Вид:

<%= form_for @pirate, :remote => true do |f| %>
  <%= f.label :name, "Pirates Name" %>
  <%= f.text_field :name %>

  <%= f.fields_for :ships do |ship| %>
    <
    <%= f.label :name, "Ship Name" %>
    <%= ship.text_field :name %>
  <% end %>

  <%= f.submit %>
<% end %>

update.js.erb:

<% @pirate.only_updated_ships.each do |u| %>
  alert("<%= u.id %>");
  do something...
<% end %>

<% @pirate.only_newly_inserted_ships.each do |i| %>
  alert("<%= i.id %>");
  do something...
<% end %>

Итак, у меня есть удаленный вызов и файлы create.js.erb и update.js.erb, где я хочу работать с возвращенными обновленными и / или вставленными дочерними объектами.

Проблема в том, что вы получаете @pirate как возвращаемое значение для успешного поста / пут. И, позвонив @ pirate.children, вы, конечно же, получите всех детей.

Надеюсь, теперь моя проблема прояснилась?

1 Ответ

2 голосов
/ 21 апреля 2011

это помогает?

u = User.first
u.login #=> 'hello'
params[:user] #=> { :login => 'world' }
u.attributes = params[:user]
u.login #=> 'world'. Other attributes are the same as before 
u.changed #=> ["login"]

Просто довольно сложно дать прямой ответ, если вы не покажете нам код;)

UPDATE:

Не уверен, что это сработает, но стоит попробовать: попробуйте @pirate.attributes = params[:pirate] вместо @pirate.update_attributes(params[:pirate]) то,

@only_updated_ships = @pirate.ships.find_all { |ship| ship.changed? }
@only_updated_ships.each { |ship| ship.save }
...