我试图仅显示顺序中不存在的那些媒体类型。请在下面的代码中找到:
错误:
**NoMethodError in Orders#building
Showing /app/views/orders/_add_media_form.html.haml where line #51 raised:
undefined method `media_type_id' for
#<ActiveRecord::Associations::CollectionProxy []>
Extracted source (around line #51):
50 - if @request.media_type_id.empty?
51 %table.media_search_results
add_media_form.html.haml
- if @request.media_type_id.empty?
%table.media_search_results
%thead
%tr
%th.quantity Quantity
%th Media Type
%th Measurement Suite
//%th ID
%tbody
- @form.media_types.each do |media_type|
%tr
%td
= text_field_tag "media_type_quantity[#{media_type.id}]", "",
class: "quantity_input", type: :number, min: 0
%td= media_type.name
%td= media_type.measurement_suite.name
订单控制器:
def building
raise Order::CannotModifyOrder, "This order cannot be modified" unless @order.creating? || @order.stock_order?
@form = MediaSearchForm.new params[:form]
@request = @order.media_order_requests
@request.each.map{|request| media_types = MediaType.where.not(id: request.media_type_id)} #where media_type.id != requests.media_type_id
#@requests.each.map{|r| media_types = media_types.where(id != r.media_type)}
end
媒体搜索表:
def media_types
@media_types ||= if self.button.present?
media_types = MediaType.not_hidden.active.search(self.search).includes(:measurement_suite)
media_types = media_types.for_measurement_suite(self.measurement_suite_id) if self.measurement_suite_id.present?
media_types = media_types.sort_by{|mt| [mt.measurement_suite.name, mt.name] }
media_types
end
end
****如果我以添加媒体形式进行操作,它将显示库存中的所有媒体类型:**** -如果@ form.media_types.present?
%table.media_search_results
%thead
%tr
%th.quantity Quantity
%th Media Type
%th Measurement Suite
//%th ID
%tbody
- @form.media_types.each do |media_type|
%tr
%td
= text_field_tag "media_type_quantity[#{media_type.id}]", "",
class: "quantity_input", type: :number, min: 0
%td= media_type.name
%td= media_type.measurement_suite.name
//%td= media_type.id
答案 0 :(得分:0)
我认为您得到的错误是因为在构建方法中,您将@result
设置为@order.media_order_requests
的{{1}}
<ActiveRecord::Associations::CollectionProxy []>
这就是 @request = @order.media_order_requests
在您看来的含义。因此,当您在视图中调用@result
时,就是在@request.media_type_id.empty?
对象上调用media_type_id
,该对象没有这种方法,并且是您得到的确切错误消息。
在您的构建方法中,在分配<ActiveRecord::Associations::CollectionProxy []>
@request
您似乎在想此语句将修改@request.each.map{|request| media_types = MediaType.where.not(id: request.media_type_id)}
,但实际上并没有,它只是返回一个根据您提供的块映射的新数组。然后,该数组由@request
方法返回,可能永远不会使用。
要修改building
,您需要做类似@request
的操作,但是最好设置一些新变量,这是我认为您尝试使用{{ 1}}语句在您的地图函数中。
有更有效的方法来执行此操作,但是由于我们看不到模型的详细信息,因此您可以尝试类似的操作
@request = @request.map ...
我显然无法对此进行测试,但希望这能使您朝正确的方向前进。
,然后在您的视图中使用media_types = MediaType.where.not(id: request.media_type_id)
请注意,您似乎在视图中执行很多逻辑,逻辑属于模型和控制器。