在控制器中调用模型的正确方法是什么

时间:2014-05-01 19:15:23

标签: ruby-on-rails ruby activerecord

厨师有一个位置和位置属于Chef。

在位置控制器中,如何致电厨师。以下是我到目前为止的情况。

class LocationsController < ApplicationController
  def index
    @chef = Location.find_by_chef_id #This is what I am not getting.  Should it be,
    @chef = Location.find(params[:chef_id])??
    @locations = Location.all
  end
end

我想在我的视图中使用&lt;%= chef.name%&gt;

之类的东西来调用它

这可能是正确的吗?

@location= Location.find(params[:id])
@chef = Chef.find(@location.chef_id)

@chef.each do |chef|
    <%= chef.name %>
end

这会显示此错误“无法找到没有ID的位置”

3 个答案:

答案 0 :(得分:1)

如果每个位置belongs_to是一名厨师,那么:

@locations = Location.includes(:chef).all

然后你可以迭代这些:

@locations.each do |location|
   location.chef
end

或者如果你想要所有的厨师:

@chefs = @locations.collect(&:chef).uniq

这可能是获取此功能的更好方法,但目前还不清楚您正在寻找什么。

答案 1 :(得分:1)

您可以从LocationsController调用任何模型:

class LocationsController < ApplicationController
  def index
    @chefs = Chef.all
    @chef = Chef.find(params[:id])
    @locations = Location.all
    @location = Location.find(params[:id])
  end
end

如果您想在视图中调用厨师的名字:

@location.chefs.each do |chef|
  <%= chef.name %>
end

这完全取决于您尝试渲染的内容类型,但最好直接在控制器中调用模型,除非需要某些关联。

@location.chefs.each do |chef|
  if !chef.name.blank?
    <%= chef.name %>
  end
end

答案 2 :(得分:1)

您可以Location搜索id,然后获取其主厨。

def index
   @location = Location.find(params[:id])
end

然后在视图中:

@location.chef.each do |chef|
   <%= chef.name %>
end

如果chef可以nil使用#try方法:

@location.chef.try(:each) do |chef|
   <%= chef.name %>
end

Location模型shell包含belongs_to声明:

class Location < ActiveRecord::Base
   belongs_to :chef
end