web-dev-qa-db-ja.com

「Ruby on Rails Railsでのレイアウトとレンダリング」というガイドから)のrenderメソッドでの:alert(または:notice)の使用は、私のために働く:

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

Railsガイドはrenderでフラッシュ値を使用することに言及しているので、現時点ではredirect_toでのみ動作するように見えるため、混乱しています。 renderメソッド呼び出しの前にflash.now[:alert] = 'Alert message!'を置くと、アプローチが機能することがわかります。

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

27
Dan Wich

試して

  def bye
    @counter  = 4
    flash.now[:error] = "Your book was not found"
    render :index
  end
25
PericlesTheo

通常、次のようなことをします。

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

参照: http://www.perfectline.co/blog/2011/11/adding-flash-message-capability-to-your-render-calls-in-Rails-3/

8
Karl Wilbur