Как изменить размещение flash[:notice] только на одной странице в Rails?

Мне нужно разместить все мои флэш-уведомления ниже заголовка, кроме одной страницы.

Только на одной странице я должен разместить это по-другому.

ИЗМЕНИТЬ

Я добавил в свой актон, где я хочу использовать другой макет, эту строку:

  render :layout => 'show'

и теперь, когда я собираюсь показать страницу, она дает мне:

  undefined method `url' for nil:NilClass

но без рендеринга ЭТОГО макета - ошибок нет.

ИЗМЕНИТЬ

Возможно ли это в Rails?


person deny7ko    schedule 04.10.2012    source источник
comment
Используйте макеты. Например, один макет основной, там вы рендерите свой флеш, а второй — это ваш другой макет с конкретным рендерингом флеша.   -  person Denis Tataurov    schedule 04.10.2012
comment
@Denis, привет тёзка) Когда я создал макет show, начали возникать странные ошибки.   -  person deny7ko    schedule 04.10.2012
comment
Какие ошибки? Их размещение поможет.   -  person gerky    schedule 04.10.2012
comment
Я использую тот же макет ПО УМОЛЧАНИЮ, но БЕЗ уведомлений.   -  person deny7ko    schedule 04.10.2012
comment
Вам не нужно копировать весь макет только для 1 изменения. Почему вы не показываете flash с условием if? если текущая_страница и т.д...   -  person emrahbasman    schedule 04.10.2012
comment
Если эта страница мне нужно переместить ее в другое место. Как я могу это сделать?   -  person deny7ko    schedule 04.10.2012
comment
Если вы планируете поместить быстрое сообщение в определенный шаблон, вы можете добавить условие, отключающее быстрое сообщение в конкретном шаблоне.   -  person gerky    schedule 04.10.2012
comment
@beef, я не могу запустить конкретный шаблон из-за странной ошибки, которую я опубликовал.   -  person deny7ko    schedule 04.10.2012
comment
подождите, я думал, что эти ошибки были из-за нового макета, который вы использовали (layouts/show.html.erb)? Попробуйте просто добавить условие, при котором отображается это быстрое сообщение, и добавьте быстрое сообщение в определенный шаблон (например: имя_контроллера/template.html.erb).   -  person gerky    schedule 04.10.2012
comment
@beef, да, ты меня правильно понял. когда я использую код, который я разместил, это дает мне ошибку. Что вы можете сказать об этом?   -  person deny7ko    schedule 04.10.2012
comment
Вероятно, вы вызываете URL-адрес объекта, к которому ваши представления не могут получить доступ. Но, как предложил Эмра, вы можете просто использовать условие if вместо создания нового макета только для этого, что кажется пустой тратой времени.   -  person gerky    schedule 04.10.2012
comment
Вы можете установить переменную экземпляра, скажем @ template_name и что-то вроде = render flash[:notice] if @ template_name == something, хотя это выглядит довольно хакерским. Проверьте stackoverflow.com/questions/4973699/. Хотя сейчас я думаю, что создание нового макета кажется лучшим выбором.   -  person gerky    schedule 04.10.2012


Ответы (2)


Навскидку, вы могли бы просто проверить текущее действие контроллера # в представлении, чтобы увидеть, нужно ли перемещать наши флэш-сообщения.

Rails передает эти параметры каждому представлению (например, если бы мы были в действии show действия UsersController):

params[:controller] #=> users
params[:action]     #=> show

Мы могли бы добавить помощника, чтобы упростить наше условие в представлении:

# file: app/helpers/application_helper.rb
def move_flash_messages?
  params[:controller] == "users" && params[:action] == "show"
end

А затем выполните эту простую проверку в нашем макете:

# file: app/views/layouts/application.html.haml
- unless move_flash_messages?
  = flash_messages
...
- if move_flash_messages?
  = flash_messages
person danneu    schedule 04.10.2012

Это очень легко показать флэш-сообщение в любом месте

  <% flash.each do |name, msg| %>
    <%= content_tag :div, msg, class: "flash notice" , id:"flash_notice" %>
  <% end %>

вот css для флеш-сообщения

div.flash.notice {
  background: url(../images/true.png) 8px 5px no-repeat;
  background-color: #dfffdf;
  border-color: #9fcf9f;
  color: #005f00;
}
person Nikhil Thombare    schedule 30.06.2015