不要显示已按顺序存在的媒体类型

时间:2019-02-08 12:05:44

标签: ruby-on-rails ruby

我试图仅显示顺序中不存在的那些媒体类型。请在下面的代码中找到:

错误:

**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

1 个答案:

答案 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)

请注意,您似乎在视图中执行很多逻辑,逻辑属于模型和控制器。