2013-08-19 3 views
0

вопрос о link_to_if в rails 4.0, потому что я только что обновил. Не было проблем с версией Rails 3.link_to_if in Rails 4.0

Упрощенный пример:

link_to_if(user, "User", user.id) 
    content_tag(:span, "No User") 
end 

Таким образом, для данного объекта пользователя он просто установить его идентификатор в ссылке. Моя проблема теперь в случае отсутствия пользователя (nil)/can даже hardcode «false» здесь. В старой Rails 3 он просто игнорирует параметры.

В Rails 4 он странно запускает параметры, даже если условие не выполняется. Почему это? Нужно ли мне проверять нуль, даже если это уже было сделано?

Редактировать, реальный код:

def link_to_previous_poster 
    link_to_if(@poster.prev, "< Previous".html_safe, poster_path(@poster.prev, :skip => skip_poster.to_i-1), :accesskey => 'h') do |name| 
    content_tag(:span, '< Previous'.html_safe, :class => "current") 
    end 
end 

В случае @ poster.prev == ноля это вызывает poster_path с нулевой стоимостью, что приводит к ошибке маршрутизации.

Ошибка в браузере:

ActionController :: UrlGenerationError в плакате # показать Показаны /.../show.html.haml где линия # 5 не поднял:

нет соответствующего маршрута {: действие => "шоу",: контроллер => "плакаты",: идентификатор => ноль,: формат => ноль,: пропустить => - 1} отсутствуют необходимые ключи: [: идентификатор]

+0

вы пробовали 'link_to_if (user.present ?, "Пользователь", user.id) [и т.д.]'? – MrYoshiji

+0

Покажите нам ошибку. – Serabe

+0

он не работает, даже я использую 'link_to_if (false,« User », user.id)' it вызывает user.id – Calmon

ответ

2
poster_path(@poster.prev, :skip => skip_poster.to_i-1) 

Этот код будет выполняться независимо от @poster.prev, являющегося nil/falsy. Вы передаете приведенное выше значение в link_to_if в качестве аргумента; это будет оценено, и это будет . Возвращаемое значение будет передано в link_to_if в качестве аргумента.

Я хотел бы переписать помощник

def link_to_previous_poster 
    return content_tag(:span, '< Previous'.html_safe, :class => "current") if @poster.prev.blank? 

    link_to(@poster.prev, "< Previous".html_safe, poster_path(@poster.prev, :skip => skip_poster.to_i-1), :accesskey => 'h') 
end 
+1

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