Использование: предупреждения (или: уведомление) с помощью метода рендеринга из руководства Ruby On Rails, называемого "Макеты и рендеринг в Rails", не работает для меня:
Использование: предупреждения (или: уведомления) с помощью метода рендеринга из руководства Ruby On Rails, называемого "Макеты и рендеринг в Rails", http://guides.rubyonrails.org/layouts_and_rendering.html, не работает для меня
Что пример кода приведен в руководстве:
def index
@books = Book.all
end
def show
@book = Book.find_by_id(params[:id])
if @book.nil?
@books = Book.all
render "index", :alert => 'Your book was not found!'
end
end
У меня есть контроллер hello, который выглядит так:
class HelloController < ApplicationController
def index
@counter = 5
end
def bye
@counter = 4
render "index", :alert => 'Alert message!'
end
end
Мой индекс index.html.erb выглядит следующим образом:
<ul>
<% @counter.times do |i| %>
<li><%= i %></li>
<% end %>
</ul>
При доступе к http://localhost:3000/hello/bye
я вижу индексный указатель, т.е. список чисел от 1 до 4, как ожидалось, но там нет сообщения "Оповещение!". показ предупреждений.
Мой макет использует это для отображения предупреждающих сообщений:
<% flash.each do |k, v| %>
<div id="<%= k %>"><%= v %></div>
<% end %>
Ответы
Ответ 1
Я смущен, почему в Rails Guide упоминаются значения флэш-памяти в render
, так как они только работают в redirect_to
на данный момент. Я думаю, вы обнаружите, что ваш подход работает, если вы положили flash.now[:alert] = 'Alert message!'
перед вызовом метода визуализации.
Изменить: это недостаток в направляющих, которые будут исправлены, вы должны использовать отдельный вызов метода для установки вспышки перед вызовом визуализации.
Ответ 2
Try
def bye
@counter = 4
flash[:error] = "Your book was not found"
render "index"
end
Ответ 3
Обычно вы делаете что-то вроде:
if @user.save
redirect_to users_path, :notice => "User saved"
else
flash[:alert] = "You haz errors!"
render :action => :new
end
Что вы хотите сделать (и мне нравится этот синтаксис намного лучше):
if @user.save
redirect_to users_path, :notice => "User saved"
else
render :action => :new, :alert => "You haz errors!"
end
... однако это неверно для ActionController::Flash#render
.
Но вы можете расширить ActionController::Flash#render
, чтобы сделать точно, что вы хотите:
Создайте config/initializers/flash_renderer.rb
со следующим содержимым:
module ActionController
module Flash
def render(*args)
options = args.last.is_a?(Hash) ? args.last : {}
if alert = options.delete(:alert)
flash[:alert] = alert
end
if notice = options.delete(:notice)
flash[:notice] = notice
end
if other = options.delete(:flash)
flash.update(other)
end
super(*args)
end
end
end
Ссылка: http://www.perfectline.co/blog/2011/11/adding-flash-message-capability-to-your-render-calls-in-rails-3/