我正在创建一个应用程序,它会根据单词中定义的字母显示随机图片。
图像使用Paperclip附加到图片模型(包含另一个“字母”字段),并将在每个块中迭代。
如何将信件从每个块传回模型进行随机选择。
这是我到目前为止所提出的,但它会引发以下错误。
undefined method `%' for {:letter=>"e"}:Hash
型号:
def self.random(letter)
if (c = count) != 0
find(:first, :conditions => [:letter => letter], :offset =>rand(c))
end
end
查看:
<% @letters.each do |a| %>
<%= Picture.random(a).image(:thumb) %>
<% end %>
由于
答案 0 :(得分:1)
一个问题是您的条件有语法错误。哈希表示法是错误的:
:conditions => [:letter => letter]
应该是
:conditions => {:letter => letter}
另外,在我看来,如果你不允许0的偏移量,你的随机范围将始终排除第一张图片。除此之外,如果随机数为0,你真的想要返回nil吗?
Picture.random(a).image(:thumb)每次c == 0时都会抛出“未定义的方法'图像'为nil:NilClass”异常。可以只使用:
def self.random(letter)
find(:first, :conditions => {:letter => letter}, :offset =>rand(count))
end
编辑:您需要保证您的数据库包含所有字母的图像,或者告诉用户没有给定字母的图像。
<% @letters.each do |a| %>
<% if pic = Picture.random(a).image(:thumb) %>
<%= pic.image(:thumb) %>
<% else %>
No image available for <%= a %>
<% end %>
<% end %>
或类似......
编辑:实际上我认为你的偏移策略不会起作用。另一种方法是返回给定字母可用的图像集,并从该集合中随机选择,如:def self.random(letter)
pics = find(:all, :conditions => {:letter => letter})
pics[rand(pics.size)] if !pics.blank?
end