2014-08-02 4 views
4

Я искал повсюду, и мне интересно, не делаю ли я что-то неправильно. И просто, чтобы проверить, я спрошу вас, ребята!Проверка типов параметров в Rails

Так что я получаю params в контроллере Rails. Один key, value пара - :status => true/false. Тем не менее, я считаю, что, когда я пытаюсь опубликовать status в виде строки, как

:status => "THIS IS NOT A BOOLEAN"

и создать свой объект в мой контроллер, атрибут моего объекта :status становится false.

Таким образом, есть ли какой-либо чистый способ в рельсах, чтобы подтвердить, что мой :status соответствует логическому?

Спасибо!

ответ

3

Это очень странный метод на хитрость

def is_boolean?(item) 
    !!item == item 
end 

params[:status] = 'some string' 
is_boolean?(params[:status]) 
# => false 

params[:status] = true 
is_boolean?(params[:status]) 
# => true 

немного более интуитивным версия будет

def is_boolean?(item) 
    item == false || item == true 
end 
+0

Nice - I + 1'd за изобретательность –

1

The above @Iceman solution is good если вы только делаете это один раз место, но вы продолжаете делать/повторять его в В других местах я предлагаю вам создать метод to_bool. i.e

class String 
    def to_bool 
    return true if self == true || self =~ (/(true|t|yes|y|1)$/i) 
    return false if self == false || self.blank? || self =~ (/(false|f|no|n|0)$/i) 
    raise ArgumentError.new("invalid value for Boolean: \"#{self}\"") 
    end 
end 

и поместите этот метод в интилизатор или в библиотеку. И, вы можете просто сделать это

Mymodel.new(status: params[:status].to_s.to_bool) 

мы делаем to_s только потому, что для преобразования nil в '' упаковывают ключ status не в params.

1

Validation

Rails way сделать это проверить в модели (from the docs):

#app/models/model.rb 
Class Model < ActiveRecord::Base 
    validates :status, inclusion: { in: [true, false] }, message: "True/False Required!" 
end 

-

MVC

Причина этого заключается в два раза :

  1. DRY
  2. MVC

Если вы хотите сохранить DRY приложения, вам необходимо убедиться, что у вас есть только одна ссылка на проверки во всем.Известный как "Single Source Of Truth", это означает, что если вы попытаетесь заполнить модель другими контроллерами/методами, вы все равно будете использовать ту же проверку.

Во-вторых, вам необходимо рассмотреть MVC (Model-View-Controller) pattern. MVC является основным аспектом Rails и означает, что вы должны использовать свой контроллер для сравнения только данные - вытягивание & сбор данных в модели. Это справедливо и для валидаций - всегда убедитесь, что вы сохранили свои данные с данными (IE в модели)

+0

Что делать, когда вам нужно получить данные? – Orlando

Смежные вопросы