我目前正在尝试使用best_in_place gem来在HTML表格中进行内联编辑。我在购物车的展示视图中显示了一个购物车。在购物车的展示视图中,我可以添加lineItems。创建LineItem时,还会使用lineItem_id创建新的可用记录,然后在购物车中显示其lineitem。 Cart和LineItem表都来自外部数据库,因此我无法添加列,这就是为什么我不能只为LineItem添加一个可用的布尔属性。
**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编辑购物车展示视图中的html表格中的line_item.available.boolean但我没有运气..任何帮助都会令人惊叹! =]我知道在阅读之后,使用嵌套属性是不可能的,但是如果我能以某种方式摆脱可用模型并在show table中有一个字段,我可以为line_item编辑以查看lineItem是否可用那也很棒。我对任何想法持开放态度!
答案 0 :(得分:5)
首先,我们需要修复代码中的一些语法问题:
RETURN_VALUE
正如我在this Github issue中解释的那样,您需要传递@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
选项和param
选项(过去为url
,但在v3.0.0中已弃用) to best_in_place。
path
选项默认网址是best_in_place的第一个参数的更新操作。由于您的代码以url
开头,因此默认为best_in_place line_item.available
。但是,您希望它修补LineItemsController的更新操作,即url_for(line_item.available.id)
url_for(line_item)
选项默认情况下,param选项假定您正在修改可用控件,因此以下是Rails约定所需的参数,以便将available.boolean更新为值&#34; 1&#34;:< / p>
param
可用的ID已在URL中,因此您需要传递的唯一额外参数是{"available"=>{"boolean"=>"1"}}
的新值。
但是,在您的情况下,您正在修补LineItemsController并且可用模型接受嵌套属性。这需要两次调整:
LineItem的ID已在URL中,但可用的ID不在。我们在这里有两个选择:将Available的ID放入param选项,或者通过将boolean
传递给模型中的update_only: true
来使ID不必要。根据您的使用情况,accepts_nested_attributes
方法可能对您不起作用,但我发现它是绝大多数时候最简单的方法,并且免费添加了额外的安全层。
布尔选项需要正确嵌套,即:
update_only
这样,当它到达服务器时,参数将是:
line_items[available_attributes][boolean]
请注意,您需要在控制器中允许这些属性,即:
{"line_item"=>{"available_attributes"=>{"id"=>"99","boolean"=>"1"}}}
# "99" is just an example of line_item.available.id
将所有内容放在一起,这是您的best_in_place方法:
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 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