【问题标题】:Cocoon gem, collection_select don't work with drink_id茧宝石,collection_select 不适用于drink_id
【发布时间】:2017-12-27 01:06:17
【问题描述】:

我有使用 Cocoon gem 的结构,在我的 app/views/order/_form.html.erb 中,下面的代码可以正常工作:

<%= f.collection_select(:drink_id, @drinks, :id, :name, :prompt => "Select a drink") %>

但是当我在 _drink_fields.html.erb 中使用时不起作用,返回这个:

#Drink:0x007fd30f9799f8 的未定义方法 `drink_id'

app/views/orders/_drink_fields.html.erb

  <div class='nested-fields'>
<div class="field">
  <%= f.collection_select(:drink_id, @drinks, :id, :name, prompt: 'Select a drink') %>
</div>
<%= link_to_remove_association "remove", f %>
</div>

app/views/orders/_form.html.erb

  <hr>
  <h3>Drinks</h3>
  <div id='drinks'>
    <%= f.fields_for :drinks do |drink| %>
      <%= render 'drink_fields', :f => drink %>
    <% end %>
    <div class='links'>
      <%= link_to_add_association 'add', f, :drinks %>
    </div>
  </div>
  <hr>

app/views/models/order.rb

class Order < ApplicationRecord
  belongs_to :drink, optional: true
  has_many :drinks
  accepts_nested_attributes_for :drinks, allow_destroy: true
end

app/controllers/orders_controller.rb

def set_order
  @order = Order.find(params[:id])
end

def set_drink
  @drinks = Drink.all
end
# Never trust parameters from the scary internet, only allow the white list through.
def order_params
  params.require(:order).permit(:number, :drink_id, drinks_attributes: [:id, :name, :_destroy])
end

为什么我收到了它? 怎么做才好?

谢谢大家!!

【问题讨论】:

  • 你能分享你整个表单的相关代码吗?这将帮助我们给你一个答案。到目前为止,您尝试过什么?
  • f 中是什么对象以及该对象如何与drink 关联?
  • 如果没有更多上下文,这是不可能回答的。请出示完整的表格并解释关联:为什么茧会在此标记。如果我猜的话:你有 has_many :drinks 的东西,从错误中我们可以推断出 Drink 没有 drink_id,但是 @drinks 变量和集合选择没有意义,请显示我们更多能够为您提供帮助。
  • 伙计们,我使用了相同的参考 => github.com/nathanvda/cocoon,使用订单而不是项目,使用饮料而不是任务。
  • 啊,你如何渲染表单?我怀疑@drinks 变量无法识别参考这个stackoverflow.com/questions/16242121/…

标签: ruby-on-rails cocoon-gem


【解决方案1】:

在检查您的关联时,我认为您在那里犯了一个错误。我看到以下内容

  • 订单属于饮料
  • 一个订单有很多饮料
  • 那么接下来就是:一杯饮料属于-订单。所以一杯饮料只能按一个订单?

我的猜测是您缺少订单和饮料之间的连接表。所以添加一个简单的

class OrderedDrink < ActiveRecord::Base
  belongs_to :order
  belongs_to :drink 
end

您还需要该表,因此您必须添加一个迁移来制作它(显然)。 (你可以在那里买一个数量:例如,他们点了 5 杯可乐)。

然后在Order 你得到

 class Order
   has_many :ordered_drinks, inverse_of: :order 
   has_many :drinks, through: :ordered_drinks

   accepts_nested_attributes_for :ordered_drinks 
 end 

Drink你写

 class Drink 
   has_many :ordered_drinks
   has_many :orders, through: :ordered_drinks 
 end 

(您可能不需要这些关系,以了解一杯饮料的订单数量)

然后,您无需编辑/管理 drinks 关联,而是编辑 ordered_drinks,您的 partial/collection-select 将按预期运行。

【讨论】:

  • 非常感谢您的参考,但是在您提出的这个结构中,我如何使用collection_select?示例:在 _drink_fields.html.erb 我需要选择 :drink_id of oredered_drink.rb。
  • 您使用f.fields_for :ordered_drinks 并且您的_ordered_drink.html.erb 部分看起来与您现在的_drink 部分完全一样(因为OrderedDrink 实际上 drink_idDrink 显然没有)。
  • 我同意你的观点,但我如何在订单视图中使用drink_id 或collection_select?
  • 您同意,但它不起作用?我不明白“我该如何使用”??只写文字?你有错误吗?请用您现在拥有的(代码/视图)以及您遇到的问题更新您的答案
  • 非常感谢@nathanvda,有了你提出的这个结构,我明白了,但我只是改变了一点以正常工作,在我的控制器顺序参数中:def order_params params.require(:order).permit(:number, ordereddrinks_attributes: [:id, :_destroy, drinks_attributes: [:id, :name, :_destroy,]]) end
【解决方案2】:

它不起作用的原因是,@drinks 对象上没有drink_id 方法(应该与数据库中的drink_id 列对应)。您可能想使用:id 而不是:drink_id

【讨论】:

  • 是的,但我收到一个错误“nil:NilClass 的未定义方法 `map'”。
  • @drinks 有什么价值吗? (不是零值?)
  • @drinks 收到所有饮料,工作正常,但如果我使用 :id,当单击创建时,我收到错误消息:对于 ID=
  • 如果我使用 :drink_id,点击新订单时收到错误消息 => 未定义方法 `drink_id'
  • 您可能有需要在问题中表达的逻辑问题。比如什么是与饮料的订单关系等
【解决方案3】:

感谢所有帮助解决这个问题的人,尤其是@nathanvda。 我的错误是忘记了加入饮料和订单的表格,所以我重新创建了项目,除了那个饮料和订单表之外,我还创建了一个类似@nathanvda 回答的有序饮料表。

app/models/order.rb

has_many :ordered_drinks, inverse_of: :order 
has_many :feeds, through: :ordered_drinks

accepts_nested_attributes_for :ordered_drinks, allow_destroy: true

app/controllers/orders_controller.rb

before_action :set_drink, only: [:new, :edit, :update, :destroy]
  def set_drink
    @drinks = Drink.all
  end
def order_params
  params.require(:order).permit(:number, ordered_drinks_attributes: [:id, :order_id, :drink_id, :_destroy, drinks_attributes: [:id, :name, :_destroy]])
end

app/views/orders/_form.html.erb

<hr>
<h3>Drinks</h3>
<div id='ordered_drinks'>
  <%= f.fields_for :ordered_drinks do |ordered_drink| %>
    <%= render 'ordered_drink_fields', :f => ordered_drink %>
  <% end %>
  <div class='links'>
    <%= link_to_add_association 'add drink', f, :ordered_drinks %>
  </div>
</div>
<hr>

app/views/orders/_ordered_drink_fields.html.erb

<div class='nested-fields'>
  <div class="field">
    <%= f.collection_select(:drink_id, @drinks, :id, :name, include_blank: false) %>
  </div>
  <%= link_to_remove_association "remove drink", f %>
</div>

如果有人遇到同样的问题,请联系我或发送消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多