【问题标题】:Rails logic works in view but not controllerRails 逻辑在视图中有效,但在控制器中无效
【发布时间】:2017-03-13 09:19:13
【问题描述】:

我的视图中有以下循环来显示给定锦标赛中的所有部门。当我尝试复制控制器中的逻辑,然后将变量传递给视图时,我和“未定义的方法”错误。对我做错的任何帮助将不胜感激。

型号

class Tournament < ApplicationRecord
  has_and_belongs_to_many :divisions
end
class Division < ApplicationRecord
    has_and_belongs_to_many :tournaments
end

工作控制器和视图 控制器

 def index
    @tournaments = Tournament.all
 end

查看

<% tournament.divisions.ids.each do |tdi| %>
  <%= Division.find(tdi).name %> 
<% end %>

不工作的控制器和视图 控制器

 def index
    @tournaments = Tournament.all
    @tournaments.divisions.ids.each do |tdi|
      @divisions = Division.find(tdi).name
    end
  end

查看

<%= @divisions %>

当我尝试第二个(而且我确信更正确)实现时,我在 index 方法中收到以下行的 "undefined method `divisions'" 错误:

@tournaments.divisions.ids.each do |tdi|

【问题讨论】:

  • @divisions 很可能在每个循环内。范围就在那个循环内

标签: ruby-on-rails model-view-controller methods controller


【解决方案1】:

问题是@tournaments = Tournament.all 这一行返回了tournament 对象的列表。因此,在第二行中,您不能将对象列表与任何类型的关联联系起来。您必须遍历@tournaments,然后为每个锦标赛找到divisions

 def index
    @tournaments = Tournament.all
    # you can also eager load the tournamnets
    # @tournaments = Tournament.includes(:divisions)   
    @tournaments.each do |tournament|
         tournament.divisions.ids.each do |tdi|
            @divisions = Division.find(tdi).name
         end
    end
  end

【讨论】:

    【解决方案2】:

    我认为错误告诉您的是方法 ids 不是除法方法。 Yo 必须将该方法定义为 Division 模型中的范围。

    scope :ids, -> { pluck(:id) }
    

    另一件事是我不明白你为什么要这样做:

    <% tournament.divisions.ids.each do |tdi| %>
      <%= Division.find(tdi).name %> 
    <% end %>
    

    当你可以简单地这样做时:

    <% tournament.divisions.each do |tdi| %>
      <%= tdi.name %> 
    <% end %>
    

    【讨论】:

      【解决方案3】:

      首先,在第二种情况下,您在集合上调用关联,您需要在控制器中执行此操作,最终您需要所有分区名称,这里您还有n + 1 查询问题以便解决该问题

      def index
        @tournaments = Tournament.includes(:divisions)
      end
      

      在视图中

      @tournaments.each do |tournament|
        tournament.divisions.each do |division|
          <%= division.name %>
        <% end %>
      <% end %>
      

      希望有帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-19
        • 1970-01-01
        • 2016-08-26
        • 1970-01-01
        • 1970-01-01
        • 2014-07-22
        相关资源
        最近更新 更多