El uso de: alert(o: notice) con el método de renderizado, de la guía de Ruby On Rails llamada ''Disposiciones y representación en rails'', no funciona para mí:
ruby-on-rails ruby-on-rails-3.2 (3)
Estoy confundido en cuanto a por qué esa Guía de Rails menciona el uso de valores flash en el render
, ya que solo parecen funcionar en redirect_to
en este momento. Creo que encontrará que su enfoque funciona si coloca un flash.now[:alert] = ''Alert message!''
antes de su llamada al método de render.
Edición: esta es una falla en las guías que se arreglarán , debe usar el método de llamada por separado para configurar el flash antes de llamar a la representación.
El uso de: alert (o: notice) con el método de renderizado, de la guía de Ruby On Rails llamada ''Layouts and Rendering in Rails'' en http://guides.rubyonrails.org/layouts_and_rendering.html , no funciona para mí
Ese es el código de muestra proporcionado en la guía:
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
Tengo un controlador de saludo que se ve así:
class HelloController < ApplicationController
def index
@counter = 5
end
def bye
@counter = 4
render "index", :alert => ''Alert message!''
end
end
Mi vista index.html.erb se ve así:
<ul>
<% @counter.times do |i| %>
<li><%= i %></li>
<% end %>
</ul>
Al acceder a http://localhost:3000/hello/bye
, veo la vista de índice, es decir, una lista de números del 1 al 4 como se esperaba, pero no hay un ''Mensaje de alerta''. mostrando alerta.
Mi diseño usa esto para mostrar mensajes de alerta:
<% flash.each do |k, v| %>
<div id="<%= k %>"><%= v %></div>
<% end %>
Normalmente harías algo como:
if @user.save
redirect_to users_path, :notice => "User saved"
else
flash[:alert] = "You haz errors!"
render :action => :new
end
Lo que quieres hacer es (y me gusta mucho mejor esta sintaxis):
if @user.save
redirect_to users_path, :notice => "User saved"
else
render :action => :new, :alert => "You haz errors!"
end
... sin embargo, eso no es válido para ActionController::Flash#render
.
Pero , puede extender ActionController::Flash#render
para hacer exactamente lo que quiere:
Cree config/initializers/flash_renderer.rb
con el siguiente contenido:
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
Tratar
def bye
@counter = 4
flash.now[:error] = "Your book was not found"
render :index
end