2010-01-21 3 views
0

я совершаюсравнивающие PARAMS в рельсах

if params[:type] = "Type A" 
    # do something 
end 
if params[:type] = "Type B" 
    # do something 
end 

Но я думаю, что это неправильно. Я должен использовать ==

Однако это дает мне ошибку:

Вы всухую объект, когда вы не ожидали, что

Что является лучшим способом сделать это в рельсах?

Все, что я делаю, получаю переменную кнопку радио из формы и делает логику на основе его стоимости (либо типа A или типа B)

+0

Если вы не делаете что-то странное с 'params' * перед * этим блоком кода, ошибка' nil object', определенно, не исходит из сравнения. Это происходит от того, что происходит в этом втором блоке, или того факта, что ни один из блоков не запускается. (Когда вы используете '=', первый 'if' всегда будет оценивать значение' true', поэтому первый блок всегда будет оцениваться.) –

ответ

5

Преамбула

class Hash 
    def try(arg) 
    self[arg] rescue nil 
    end 
end 

Ваш путь

if params.try(:type) == "Type A" 
    # do 
elsif params.try(:type) == "Type B" 
    # do 
end 

DRY

case params.try(:type) 
when "Type A" 
    # do 
when "Type B" 
    # do 
else 
    # default do 
end 
+1

+1 для '# try', я забыл об этом – MBO

+0

Объект # пытается работать с экземплярами моделей ActiveRecord, потому что все они предоставляют * методы * для каждого поля в строке отношения, которое они представляют. Однако он не работает с хэшем, так как вам нужно использовать Hash # []/Hash # fetch для доступа к хэш-контенту. – Caffeine

+0

Решение не вызывает исключения путем, потому что 'params' действительно имеет метод' type', который HashWithdifferentAccess/Hash унаследован от Object: Это устаревший псевдоним класса Object #. См. Http://ruby-doc.org/core/classes/Object.html#M000349 – Caffeine

3

Вы уверены, что это должно быть params[:type]? Сначала проверьте свои журналы, чтобы увидеть, что находится внутри параметров, прежде чем вы получите доступ к действию в контроллере.

Чтобы проверить несколько вариантов, вы можете использовать переключатель конструкции:

case params[:type] 
when "Type A" 
    # do sth 
when "Type B" 
    # do sth 
else # not A nor B, can be nil 
    # do nothing 
end 

И если вам нужно глубже внутри Params, то вы можете использовать, если/другое:

if params[:type] && params[:type][:value] == "sth" 
    # do sth 
elsif params[:type] && params[:type][:value] == "..." 
    # do sth 
end 

И проверить, где вы получите свой ошибка из, потому что в Ruby вы можете легко сравнить nil и String, поэтому это не из-за использования == в вашем примере.

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