Ruby on Rails Guide with 'Layouts and Rendering in 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 %>
Railsガイドはrender
でフラッシュ値を使用することに言及しているので、現時点ではredirect_to
でのみ動作するように見えるため、混乱しています。 renderメソッド呼び出しの前にflash.now[:alert] = 'Alert message!'
を置くと、アプローチが機能することがわかります。
編集:これは 修正されるガイドの欠陥 です。レンダリングを呼び出す前に、別のメソッド呼び出しを使用してフラッシュを設定する必要があります。
試して
def bye
@counter = 4
flash.now[:error] = "Your book was not found"
render :index
end
通常、次のようなことをします。
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
を拡張してexactlywhatあなたが欲しい:
次の内容で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