【发布时间】:2010-11-07 21:20:49
【问题描述】:
这是一个非常令人沮丧的新手问题,但我似乎无法在我的 rails 项目中让对象迭代工作。我有两个模型,“Photo”和“LandUse”,它们都有一个 has_and_belongs_to_many 关联。一切都在控制台中按预期工作。
但是,在照片展示动作中,我似乎无法破译什么代码会生成与照片相关的土地用途列表。我的代码如下所示:
<% for use in @photo.land_uses %>
<%= use.name %>
<% end %>
这不会产生任何输出。我也试过了:
<% @photo.land_uses.each do |use| %>
<%= use.name %>
<% end %>
...这也行不通。
如果我尝试这样的事情,在控制台中:
photo = Photo.first
photo.land_uses
我得到一张照片所属的所有土地用途的清单,这并不奇怪。
那么我如何遍历该使用列表并打印每个使用的名称?
我是 Ruby 新手,但如果我想在 PHP 中做同样的事情,那将是一个简单的 foreach 循环:
foreach($photo->land_uses as $use) {
echo $use->name;
}
那么我在这里错过了什么?
更新:这里是要求的模型:
--照片模型--
class Photo < ActiveRecord::Base
belongs_to :user
belongs_to :transect
belongs_to :focus
has_and_belongs_to_many :land_uses
validates :caption, :presence => true
validates :place, :presence => true
validates :city, :presence => true
validates :country, :presence => true
has_attached_file :file,
:processors => [:watermark],
:styles => { :standard => "631x631>",
:marked => { :geometry => "631x631>", :watermark_path => "#{Rails.root}/public/images/watermark.png", :position => 'Center' },
:thumbnail => "174x130#"
},
:storage => :s3,
:s3_credentials => "#{Rails.root}/config/s3.yml",
:path => ":user_id/:year/:month/:id/:style.:extension"
geocoded_by :location, :latitude => :lat, :longitude => :lng
after_validation :fetch_coordinates
def location
[place,city,state,country].delete_if{|val| val==''||nil}.join(', ')
end
end
-- 土地利用模型--
class LandUse < ActiveRecord::Base
has_and_belongs_to_many :photos
validates_uniqueness_of :name
end
RE:错误消息... 无论是 for 还是 each 方法,我都没有收到错误消息,我只是在应该有土地用途列表的地方得到一个空白区域。
谢谢!
【问题讨论】:
-
@photo.land_uses.map(&:name)告诉你什么? -
@Tass:在似乎什么也没做的视图中,在控制台中它正确地返回了土地使用的数组。
-
也许最重要的问题首先要解决:我的代码看起来是否应该工作?我对 Ruby 很陌生,所以我的猜测是我忽略了一些关于 for 或 each 方法的明显内容并输入了错误的内容......你怎么看?
-
请发布上述命令的输出。
-
["Institutional","Civic"] ...见下文,我发现了问题所在。谢谢!
标签: ruby-on-rails ruby loops for-loop block