Rails - Пользовательская проверка, которая требует информации current_user - PullRequest
2 голосов
/ 21 ноября 2010

У меня очень сложная проблема с рельсами, и я подумал попросить о помощи.Ситуация выглядит так:

Я использую спокойную аутентификацию для моей модели User.Теперь у пользователя есть поле с именем «gold», которое является числовым значением.Существует еще одна модель с именем Book, которая была создана с использованием строительных лесов.

То, что я хочу сделать, просто, но я не вижу способа сделать это.Я хочу добавить подтверждение, когда, если у пользователя нет золота, скажем, 100, он не может создать новую запись в книге (из стандартного представления лесов).

Теперь проблема в том, что мне нужна информация current_user для того, чтобычтобы проверить это из моей модели.Мне это нужно для того, чтобы получить идентификатор пользователя и, следовательно, получить их количество золота.Я не могу найти хороший способ (если есть) сделать это.

Другая мысль делала это с контроллера.Однако стандартный блок if @ book.save на самом деле не позволяет мне вставлять свои собственные сообщения об ошибках (внутри scaffold create):

if not User.has_the_needed_gold(current_user, 100)
  flash[:goldError] = 'You do not have the needed gold to create this book.'
#end


respond_to do |format|
  if @book.save
    flash[:notice] = 'Book was successfully created.'
    format.html { redirect_to(@book) }
    format.xml  { render :xml => @book, :status => :created, :location => @book }
  else
    format.html { render :action => "new" }
    format.xml  { render :xml => @book.errors, :status => :unprocessable_entity }
  end
end

Теперь я не могу вывести это сообщение и прервать сохранениеновая книга, а также.Я попытался добавить свою собственную ошибку в базу, но она была очищена (после сохранения, я думаю).Я совершенно запутался в ситуации и искал пару часов безрезультатно.

Если кто-нибудь может помочь с этим, пожалуйста, сделайте это, вы избавите меня от многих проблем :)

Спасибо за чтение!

Ответы [ 2 ]

2 голосов
/ 21 ноября 2010

Поиск пользователя при проверке.Вероятно, что поиск пользователя будет кэшироваться ActiveRecord, так что это не удар по производительности.Попробуйте что-то вроде этого:

class Book

  validate :check_gold

  def check_gold
    user = User.find(self.user_id)
    self.errors.add(:user_id => "#{user.name} doesn't have enough gold!") if user.nil? or (user.gold < 100)
  end
end
2 голосов
/ 21 ноября 2010

Вы можете определить виртуальный атрибут :user_gold для Book, установить его в контроллере, где у вас есть доступ к current_user, а затем включить его в проверку Book.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...