不同的帖子长度验证

时间:2013-10-19 12:34:08

标签: ruby-on-rails forms

好的,所以这里没有代码我想就你如何解决这个问题得到一些反馈。

我有一本书,我想给用户一个创建短,中或长书的选项。这将创建一个整数,0,1,2然后是一个常量,并将定义帖子的长度:

我正坐在这里挠头,我应该在模型中为短,中,长创建多个类,然后在那里设置常量,以便当用户选择0时,例如它链接到类short<书。我试着把它映射到纸上,让自己更加困惑。

关于如何处理此问题的一些帮助或反馈非常有用。

编辑:感谢Sevencats,这就是我的想法。快速问题,我如何使用表单构建器集合选择在Books.size中定义这些值?

我需要通过0,1,2的形式将值传递给列大小。

2 个答案:

答案 0 :(得分:2)

这对我来说听起来像是条件验证。

如果一本书有一个属性,例如。 length和长度可以是0,1或2,然后当您向帖子添加帖子时,帖子的长度将根据父书的长度进行验证。

类似的东西(这可能不是你的确切例子但足够接近):

class Book < ActiveRecord::Base
  has_many :posts

  def short?
    length == 0
  end

  def long?
    length == 2
  end
end

class Post < ActiveRecord::Base
  belongs_to :book

  validates_length_of :content, less_than: 500, if: book.short?
  validates_length_of :content, less_than: 1000, if: book.long?
end

答案 1 :(得分:1)

回答你的第二个问题:我不会去收集。我会这样做:

Book模型中定义常量:

SIZES = {0 => 'Small', 1 => 'Medium', 2 => 'Large'}

现在可以从任何地方访问此哈希:

Book::SIZES

Book::SIZES[1]
=> "Medium" 

在视图中,当您需要选择时,请执行:

form_builder.select :size, Book::SIZES.invert

invert会将值设置为键,将键设置为值,这是select方法所需的。

想想看,你甚至可以把它放在Book模型中:

SIZES = {SMALL=0 => 'Small', MEDIUM=1 => 'Medium', LARGE=2 => 'Large'}

现在您可以转到Book::SMALL,它会为您提供0

Book模型中,您不必将Book添加到事物前面,这样您就可以随意使用MEDIUM,然后转到:

SIZES[ MEDIUM ]
# which is the same as:
SIZES[1]

它会为您提供"Medium"