首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails嵌套窗体不工作(子参数根本不传递)

Rails嵌套窗体不工作(子参数根本不传递)
EN

Stack Overflow用户
提问于 2015-10-23 23:35:07
回答 2查看 414关注 0票数 1

模型

代码语言:javascript
复制
`Buyer has_many :orders`
`Buyer accepts_nested_attributes_for :order`
`Order belongs_to :buyer`

视图(buyers#new)

代码语言:javascript
复制
<%= form_for @buyer do |f| %>
  <%= f.fields_for :orders do |o| %>
    <div class="row">
      <div class="col-xs-12">
        <%= o.label "Select your meal" %>
      </div>
    </div>
    <div class="row section">
      <div class="col-xs-1"></div>
        <% ["Pasta, pesto, & pea greens (veggie)",
           "Mushroom cutlets & mornay sauce (veggie)",
           "Italian breaded pork chop",
           "Chicken kabobs with tzatziki",
        "Asian-style sweet & sour beef"].each do |m| %>
           <div class="col-xs-2 zero-padding">
             <div class="col-xs-12">
               <% image_tag "#{m}.jpg" %>
             </div>
             <div class="col-xs-12 text-center">
               <%= o.radio_button :meal, m %>
               <br>
               <%= m %>
             </div>
           </div>
        <% end %>
      <div class="clearfix">
    </div>
  <% end %>
  ...
<% end %>

控制器(buyers)

代码语言:javascript
复制
 def new
    @buyer = Buyer.new
    @buyer.orders.build
 end

 def create
   # just to illustrate what i'm talking about, even the unsanitized parameters do not have orders_attributes
   puts params
   => {"utf8"=>"✓", "buyer"=>{"first_stripe_token"=>"tok_16zExiKQ2oHmpkBLo9y45Cv3", "delivery_instructions"=>"random", "zipcode"=>"02110", "email"=>"test@example.com", "phone1"=>"123", "phone2"=>"456", "phone3"=>"0789", "agree_tos"=>"1"}, "controller"=>"buyers", "action"=>"create"}
 end

 def buyer_params
    params.require(:buyer).permit(:first_stripe_token, :phone1, :phone2, :phone3, :zipcode, :delivery_instructions, :agree_tos, :email, orders_attributes: [:meal] )
 end

路线

代码语言:javascript
复制
match '/ondemand/create', to: 'buyers#create', via: :post, as: "buyers"

一些人提出了如何通过强参数允许嵌套属性的问题。这不是我的挑战。在我的例子中,嵌套的属性在某种程度上是完全的,正如您在上面看到的,我对未净化的参数执行puts

帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-25 05:57:41

想出答案..。但有点担心,因为这似乎是一个常见的问题,我没有看到任何地方提到它。所以如果我做错了什么..。请给我提示一下。

发生的情况是,在第二次尝试失败的提交时,没有通过orders_attributes (我在这里运行rspec测试)。它们没有被传递的原因是因为它们在形式上不存在。原因如下:

代码语言:javascript
复制
def new
  @buyer = Buyer.new
  @buyer.orders.build
end

new操作中,表单为buyerorder创建字段,因为这两个字段都已经初始化。但我最初的create操作如下:

代码语言:javascript
复制
def create
  @buyer = Buyer.new(buyer_params)
  ...
  if @buyer.save
    redirect_to '/'
  else
    render 'new'
  end
end

换句话说,如果一切顺利,并且buyer_params构建了有效的buyerorder,那就太棒了!但是,如果发生了某种错误,并且页面被重新呈现,就没有order对象来构建表单字段!

因此,的答案是:

代码语言:javascript
复制
def create
  @buyer = Buyer.new(buyer_params)
  @buyer.orders.first_or_intialize

  if @buyer.save
    ...
end

其结果是:

  • 如果没有错误,那么第一行创建了buyerorder,而第二行则是一个模拟点,因为它只是调用公正创建的order (在我的例子中,尽管我把它写成了has_many,实际上buyer只有一个order;即使不是这样,我也不会使用order对象来做任何事情,所以第二行没有坏处)。
  • 如果有错误,那么第二行实例化一个order对象,以便在重新呈现页面时,有一个order对象来构建
票数 0
EN

Stack Overflow用户

发布于 2015-10-24 00:03:31

如果您的f.fields_for块是正确的,并且其中有数据,那么即使强参数决定阻止它们,参数也是正确的。事实上,它们没有出现在params中,但是其他字段却显示在params中,这让我觉得问题就在f.fields_for块中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33312917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档