Rails逻辑在视图中工作,但不在控制器

时间:2017-03-13 09:19:14

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

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

模型

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

WORKING Controller&amp;视图 控制器

 def index
    @tournaments = Tournament.all
 end

查看

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

不工作控制器&amp;视图 控制器

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

查看

<%= @divisions %>

当我尝试第二个(并且我确定更正确)实现时,我得到索引方法中以下行的“未定义方法`divisions'”错误:

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我认为错误告诉你的是方法id不是一种划分方法。 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 %>

答案 2 :(得分:0)

首先,在第二种情况下,你在集合上调用关联,你需要在控制器中执行此操作,最终你需要所有的分区名称,在这里你还有Workbook_SheetChange查询问题所以要解决这个问题< / p>

n + 1

在视图中

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

希望有所帮助!