Rails 3 - Вложенные формы, как считать вложенные ресурсы - PullRequest
1 голос
/ 28 августа 2011

Привет, я новичок в Rails, и это мой первый stackoverflow вопрос.

В настоящее время я пишу приложение для опроса , концепция очень проста.
Пользователь может создать new poll, дав ему название и несколько возможных ответов.
Ответы могут быть добавлены или удалены с помощью ссылок javascript: void (0) (см. Рисунок)

Пока все прекрасно работает (благодаря nested_form gem Райана), но теперь я спрашиваю себя, как я могу посчитать количество ответов , поэтому я могу ограничить его, чтобы сказать максимум 5 ответов на вопрос?
(в настоящее время вы можете создавать неограниченное количество ответов)

Часть, создающая ответ, в форме опроса выглядит - ЭТО - в браузере.

Модель опроса ( poll.rb ):

class Poll < ActiveRecord::Base
  has_many :answers,  :dependent => :destroy
  accepts_nested_attributes_for :answers, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => true
end

Модель ответа ( answer.rb ):

class Answer < ActiveRecord::Base
  belongs_to :poll
  validates_presence_of :name
end


Мой текущий подход к подсчету ответов ( polls_controller.rb ):

def new
  @poll = Poll.new
  2.times { @poll.answers.build }
end


def create  
  ...

  if @poll.answers.count > 10
    flash[:alert] = 'Too many answers (not exceeding 10), please remove some'
    render :action => 'new'
    return
  end

  if @poll.save
    redirect_to poll_path(category_slug(@poll), @poll.id), :notice => 'Successfully created poll.'
  else
    render :action => 'new'
  end

  ...
end


Очевидно, мой метод не сработает, потому что ответы еще не созданы , поэтому мой вопрос:

  • Как и где ( JavaScript , Опросы-контроллер , Модель опроса ) я должен посчитать количество заданных ответов, чтобы я мог ограничить число

Спасибо, я очень ценю каждый ответ.

1 Ответ

0 голосов
/ 28 августа 2011

Работает ли лимит: как часть работы nested_attributes?

например

accepts_nested_attributes_for :answers, :limit => 5, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => true
...