38

http://guides.rubyonrails.org/layouts_and_rendering.htmlの 'Layouts and Rendering in Rails' と呼ばれる Ruby On Rails ガイドの render メソッドで :alert (または :notice) を使用してもうまくいきません。

これが、ガイドで提供されているサンプル コードです。

    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 %>
4

3 に答える 3

31

renderRails Guide が で flash 値を使用することに言及している理由について、私は混乱していますredirect_toflash.now[:alert] = 'Alert message!'render メソッド呼び出しの前に a を配置すると、アプローチが機能することがわかると思います。

編集: これは修正されるガイドの欠陥です。レンダリングを呼び出す前に、別のメソッド呼び出しを使用してフラッシュを設定する必要があります。

于 2013-03-03T21:00:42.210 に答える
29

試す

  def bye
    @counter  = 4
    flash.now[:error] = "Your book was not found"
    render :index
  end
于 2013-03-03T20:59:46.120 に答える
9

通常、次のようにします。

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/

于 2015-09-01T22:06:02.040 に答える