我是一个stackoverflow新手。请怜悯; - )
我与accepts_nested_attributes_for有一个简单的has_many关联。一切正常。但我真正需要的是更新和/或插入子项的返回值,因为我按Ajax发送表单,并且需要在成功发布/放置后仅操作这些子表单字段。
修改
型号:
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当然会给你所有的孩子。
希望我的问题现在更清楚了吗?
答案 0 :(得分:2)
这有帮助吗?
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"]
除非你向我们展示一些代码,否则给出一个直接答案有点困难;)
更新:
不确定它是否会起作用,但值得尝试:
试试@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 }