Подтвердить что ты не робот

Использование: предупреждения (или: уведомление) с помощью метода рендеринга из руководства 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 %>
4b9b3361

Ответ 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/