通过Rails以嵌套形式使用jQuery从POST参数分配属性值?
我正在Rails应用程序中使用嵌套表单()。以下是我目前的问题和我想做的事情;然而,我不确定解决这个问题的最佳方法是什么,我很想得到一些建议 我有一个通过Rails以嵌套形式使用jQuery从POST参数分配属性值?,jquery,ruby-on-rails,nested-attributes,Jquery,Ruby On Rails,Nested Attributes,我正在Rails应用程序中使用嵌套表单()。以下是我目前的问题和我想做的事情;然而,我不确定解决这个问题的最佳方法是什么,我很想得到一些建议 我有一个dish表单(\u form.html.haml),它有以下一些字段: .control-group =f.label :menu, :class => 'control-label' .controls =select("dish", "menu_id", (current_user.
dish
表单(\u form.html.haml
),它有以下一些字段:
.control-group
=f.label :menu, :class => 'control-label'
.controls
=select("dish", "menu_id", (current_user.has_role? :admin) ? (Menu.all.collect {|m| [ m.name, m.id ] }) : (current_user.menus.all.collect {|m| [ m.name, m.id ] }), {:include_blank => 'Choose a Menu'})
.control-group
=f.label :name, :class => 'control-label'
.controls
=f.text_field :name
.control-group
=f.label :category_ids, "Category", :class => 'control-label'
.controls
=f.collection_select :category_ids, (current_user.has_role? :admin) ? (Category.order(:name)) : (current_user.categories.order(:name)), :id, :name, params[:category_id].nil? ? {} : {:selected => params[:category_id]}, {multiple: true, :class => 'chzn-select'}
.controls
%p.help-block
=link_to_add_fields "Add New Category", f, :categories, "categories"
=link\u to\u add\u fields
从\u category\u fields.html.haml
文件生成一个嵌套表单,该函数在我的应用程序\u helper.rd
中定义为:
def link_to_add_fields(name, f, association, parent)
new_object = f.object.send(association).klass.new
id = new_object.object_id
fields = f.fields_for(association, new_object, child_index: id) do |builder|
render(parent + "/" + association.to_s.singularize + "_fields", f: builder)
end
link_to(name, '#', class: "add_fields", data: {id: id, fields: fields.gsub("\n", "")})
end
我的category
部分表单(\u category\u fields.html.haml
)如下所示:
%fieldset
.control-group
%h5
New Category
=f.select("menu_id", (current_user.has_role? :admin) ? (Menu.all.collect {|m| [ m.name, m.id ] }) : (current_user.menus.all.collect {|m| [ m.name, m.id ] }), {:include_blank => 'Choose a Menu'})
=f.hidden_field :_destroy
=f.text_field :name, placeholder: "Name"
=link_to "X", "#", :class => "remove_fields"
您会注意到,菜单id
已经由用户从下拉菜单的dish
表单中选择和定义:
.control-group
=f.label :menu, :class => 'control-label'
.controls
=select("dish", "menu_id", (current_user.has_role? :admin) ? (Menu.all.collect {|m| [ m.name, m.id ] }) : (current_user.menus.all.collect {|m| [ m.name, m.id ] }), {:include_blank => 'Choose a Menu'})
但是您还注意到,我正在强制用户从嵌套表单的类别
部分表单中的另一个下拉列表中重新选择菜单\u id
我希望使用它,这样用户就不需要在类别
嵌套表单中重新选择菜单id
,而是在用户点击提交按钮后,通过从传递到数据库的参数中检测新的类别
项
例如,当您点击提交按钮时,终端/控制台显示以下内容:
Started POST "/dishes" for 127.0.0.1 at 2012-08-06 09:51:41 -0700
Processing by DishesController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"tAbx+14Ve22FVimgY0x2d+fbImuG+pjkgC7Zgdco73k=", "dish"=>{"menu_id"=>"1", "name"=>"New Dish", "category_ids"=>["", "2"], "categories_attributes"=>{"1344271336031"=>{"menu_id"=>"1", "_destroy"=>"false", "name"=>""}} ... }}
我想重申一下,我希望通过选择“categories\u attributes”=>{“1344271336031”=>{“menu\u id”=>“1”…
来设置菜单id
中的“dish”=>{“menu\u id”=>“1”…
我认为最好的方法是通过jQuery,但对于jQuery,我是一个完全的新手,不知道从哪里开始,在网上搜索什么
我尝试的另一件事是使用回调并在创建后读取数据库,但这是不安全的,因为我需要考虑很多变量
更新1:快到了,但卡住了
多亏了MurifoX指针,我能够通过选择分配给盘的菜单id
来通过嵌套表单中的隐藏字段
分配菜单id
但是,当我在Dish表单中创建一个新的Dish和一个新的Category时,它会抛出我设置的验证错误,该错误会验证是否为一个新的Category对象提供了一个Category ID。因此,基本上,菜单\u ID
不会被传递到新Category对象的隐藏\u字段中
另一方面,我能够:
编辑盘子并从嵌套表单创建新类别
从自己的_form.html.haml页面创建一个新类别
并编辑现有类别项
但我不能:
- 同时从嵌套表单创建一个新的菜肴和一个新的类别项
以下是我的更新代码:
\u category\u fields.html.haml
...
=f.hidden_field :menu_id, :value => @dish.nil? ? [:dish][:menu_id] : @dish.menu_id
...
categories\u controller.rb
def create
if @dish.blank?
@category = Category.new(params[:category])
else
@category = Category.new(:menu_id => [:dish][:menu_id], :name => [:category])
end
respond_to do |format|
if @category.save
format.html { redirect_to categories_path, notice: 'Category was successfully created.' }
else
format.html { render action: "new" }
end
end
end
def update
@category = Category.find(params[:id])
respond_to do |format|
if @dish.blank?
if @category.update_attributes(params[:category])
format.html { redirect_to categories_path, notice: 'Category was successfully updated.' }
else
format.html { render action: "edit" }
end
else
if @category.update_attributes(:menu_id => [:dish][:menu_id], :name => [:category])
format.html { redirect_to categories_path, notice: 'Category was successfully updated.' }
else
format.html { render action: "edit" }
end
end
end
end
为什么不使用您已有的params[:dish][:menu\u id]
,并在控制器上手动设置它?您的意思是,在my\u category\u fields.html.haml
中为menu\u id
创建一个隐藏字段,并将值分配给params[:menu\u id]
?或者,您能详细说明一下吗?您的意思是在category\u controller.rb的create
功能中?是的,在create
操作中,您可以访问参数[:dish][:menu id]
,所以当你构建其他对象时,你可以使用参数为它们中的每一个设置菜单id
。我不知道我是否足够清楚。谢谢MurifoX。我能够分配菜单id
,但当我同时去创建一个新菜和一个新类别时遇到了问题。我已经用关于这个问题的更多细节。你能帮我吗?谢谢!让我看看我是否正确理解了你的问题。你有一个dish
,其中有很多:类别
。一个表单,你可以保存一个dish和0个或多个类别,并且你正试图为这两个类别设置一个菜单id
,它来自下拉列表,对吗?如果这是正确的,我认为所有这些都应该首先在dishs\U控制器上。毕竟,主要对象对吗?