Передача параметра обратно в модель для уточнения случайного действия - PullRequest
0 голосов
/ 15 октября 2010

Я создаю приложение, которое будет отображать случайное изображение на основе определенной буквы в слове.

Изображения прикрепляются к модели «Изображения» (содержащей другое поле «буквы») с помощью скрепки и будут повторяться в каждом блоке.

Как бы я мог передать письмо обратно из каждого блока в модель для случайного выбора.

Это то, что я до сих пор придумал, но выдает следующую ошибку.

 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 %>

Спасибо

1 Ответ

1 голос
/ 15 октября 2010

Одна проблема - в ваших условиях есть синтаксическая ошибка. Неверная запись хеша:

:conditions => [:letter => letter]

должно быть

:conditions => {:letter => letter}

Кроме того, мне кажется, что ваш случайный прицел всегда будет исключать первое изображение, если вы не допустите смещение 0. Кроме того, вы действительно хотите вернуть nil, если случайное число было 0?

Picture.random (a) .image (: thumb) будет генерировать исключение "неопределенный метод 'image' для исключения nil: NilClass" каждый раз, когда c == 0. Вероятно, можно просто использовать:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...