Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Rails以嵌套形式使用jQuery从POST参数分配属性值?_Jquery_Ruby On Rails_Nested Attributes - Fatal编程技术网

通过Rails以嵌套形式使用jQuery从POST参数分配属性值?

通过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.

我正在Rails应用程序中使用嵌套表单()。以下是我目前的问题和我想做的事情;然而,我不确定解决这个问题的最佳方法是什么,我很想得到一些建议

我有一个
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控制器上。毕竟,主要对象对吗?