gpt4 book ai didi

ruby-on-rails - 具有嵌套属性的 Best_In_Place 内联编辑

转载 作者:行者123 更新时间:2023-12-04 19:01:56 24 4
gpt4 key购买 nike

我目前正在尝试使用 best_in_place gem 以便在 HTML 表中进行内联编辑。我正在购物车的显示 View 中显示购物车。在购物车的显示 View 中,我可以添加 lineItems。创建 LineItem 时,还会创建一个带有 lineItem_id 的新可用记录,然后它会与它的 lineitem 一起显示在购物车中。 Cart 和 LineItem 表都来自外部数据库,因此,我无法向其中添加列,这就是为什么我不能向 LineItem 添加可用的 bool 属性的原因。

**cart.rb
class Cart << AR::Base
has many LineItems
end

**line_item.rb
class LineItems <<AR::Base
belongs_to Cart
has_one :available
accepts_nested_attributes_for :available
end

**available.rb
class Available<<AR::Base
belongs_to LineItems
end


**views/cart/show.html.erb
@cart.lineitems.each do |line_items|
<td><%= line_item.price %></td>
<td><%=line_item.name %></td>
<td><%= best_in_place line_item.available.boolean, :boolean, :path => line_items_path, :type => type: :checkbox, collection: %w[No Yes] %></td>
end

我希望能够使用 best_in_place 在购物车显示 View 上的 html 表中编辑 line_item.available.boolean 但我没有任何运气..任何帮助都会很棒! =] 我在阅读之后知道使用嵌套属性是不可能的,但是如果我能以某种方式摆脱可用模型并在显示表中有一个字段,我可以编辑 line_item 以查看 lineItem 是否可用,那也太好了。我愿意接受任何想法!

最佳答案

首先,您的代码中有一些语法问题需要修复:

@cart.lineitems.each do |line_item| # changed "line_items" to "line_item"
<td><%= line_item.price %></td>
<td><%=line_item.name %></td>
<td><%= best_in_place line_item.available, :boolean, :path => line_items_path, type: :checkbox, collection: %w[No Yes] %></td> # changed "line_item.available.boolean" to "line_item.available" and ":type => type: :checkbox" to "type: :checkbox"
end

现在,答案是:

正如我在 this Github issue 中解释的那样,你需要传递一个 param选项和 url选项(曾经是 path 但在 v3.0.0 中已弃用)到 best_in_place。
url选项

默认 url 是 best_in_place 的第一个参数的更新操作。由于您的代码以 best_in_place line_item.available 开头,这将默认为 url_for(line_item.available.id) .但是,您希望它修补 LineItemsController 的更新操作,即 url_for(line_item) param选项

默认情况下,param 选项假定您正在修补 AvailablesController,因此以下是 Rails 约定将 available.boolean 更新为值“1”所需的参数:
{"available"=>{"boolean"=>"1"}}

可用的 ID 已经在 URL 中,因此您需要传递的唯一额外参数是 boolean 的新值。 .

但是,在您的情况下,您正在修补 LineItemsController 并且可用模型接受嵌套属性。这需要两个调整:
  • LineItem 的 ID 已经在 URL 中,但可用的 ID 不在。我们在这里有两个选择:要么将可用的 ID 放入 param 选项,要么通过传递 update_only: true 使 ID 变得不必要。至 accepts_nested_attributes在模型中。 update_only根据您的用例,方法可能对您不起作用,但我发现它在绝大多数情况下是最简单的方法,并且免费添加了额外的安全层。
  • bool 选项需要正确嵌套,即:
    line_items[available_attributes][boolean]

    这样,当它到达服务器时,参数将是:
    {"line_item"=>{"available_attributes"=>{"id"=>"99","boolean"=>"1"}}}
    # "99" is just an example of line_item.available.id

    请注意,您需要在 Controller 中允许这些属性,即:
    line_item.update(params.require(:line_item).permit(
    available_attributes: [:id, :boolean]))
    # You can remove `:id` if you are using the `update_only` option

  • 总而言之,这是您的 best_in_place 方法:
    best_in_place line_item.available, :boolean, 
    type: :checkbox,
    url: line_item_path(line_item.id),
    param: "line_item[available_attributes][id]=#{line_item.available.id}&line_item[available_attributes]"

    但是,如果可能,请使用 update_only选项。
    # line_item.rb
    accepts_nested_attributes_for :available, update_only: true

    看看它现在变得多么简单:
    best_in_place line_item.available, :boolean, 
    type: :checkbox,
    url: line_item_path(line_item.id),
    # Note: `url: line_item` might also work.
    # If someone can confirm this in a comment, I can update this answer
    param: "line_item[available_attributes]"

    关于ruby-on-rails - 具有嵌套属性的 Best_In_Place 内联编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35531279/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com