Rails: потеря flash / ошибок из встроенной формы после redirect_to - PullRequest
1 голос
/ 09 декабря 2010

Это глупый пример, но я пытаюсь понять, как это происходит за кулисами в Rails. И, возможно, есть лучший, "Rails", способ подойти к этому ... если так, пожалуйста, дайте мне знать. У меня есть:

Warren has_many Rabbits
Rabbit belongs_to Warren

Я перечисляю существующих кроликов и затем предоставляю форму для добавления нового кролика.

Уоррены / show.html.haml

%h1 This Warren

%h2 Rabbits
= render @warren.rabbits, :target => @warren

%h2 Add a rabbit:
= render "rabbits/form", :parent => @warren, :foreign_key => :warren_id

= link_to 'Edit', edit_warren_path(@warren)
\|
= link_to 'Back', warrens_path

Это работает. Я могу добавлять и уничтожать кроликов, глядя на вид шоу Уоррена. Проблема в том, что сообщения flash (:success, :notice) и / или rabbit.errors не отображаются в / в представлении. Теперь я не использую accepts_nested_attributes_for в моей модели warren.rb. но это в основном работает. Изучая Rails, интересно, что происходит, и , как сделать так, чтобы мои сообщения проходили гладко ...

Кролики / _form.html.haml

= form_for ([parent, parent.rabbits.build]) do |f| 
    = render "shared/error_messages", :target => parent

    .field
        = f.label :name
        = f.text_field :name
    .field
        = f.label :color
        = f.text_field :color
    .field
        = f.hidden_field foreign_key
    .actions
        = f.submit 'Save'

Макеты / application.html.haml

    !!!
    %html
        %head
               ...
        %body
            .container
                - flash.each do |key, value|
                    %div{ :class => ['flash', key] }= value
                = yield

rabbits_controller.rb

class RabbitsController < ApplicationController

  def create
    @warren = Warren.find(params[:warren_id])
    @rabbit = @warren.rabbits.create(params[:rabbit])
    redirect_to @warren
  end

  def destroy
    @warren = Warren.find(params[:warren_id])
    @rabbit = @warren.rabbits.find(params[:id])
    @rabbit.destroy
    redirect_to @warren
  end

общая / _error_messages.html.haml

-if target.errors.any?
  #error_explanation
    %h2= "#{pluralize(target.errors.count, "error")} prohibited this record from being saved:"
    %ul
      - target.errors.full_messages.each do |msg|
        %li= msg

1 Ответ

2 голосов
/ 10 декабря 2010

Похоже, вы не устанавливаете флэш-сообщения в вашем контроллере. Попробуйте следующее:

def create
  @warren = Warren.find(params[:warren_id])
  @rabbit = @warren.rabbits.create(params[:rabbit])
  redirect_to @warren, :flash => { :info => "Rabbit was just born." }
end

def destroy
  @warren = Warren.find(params[:warren_id])
  @rabbit = @warren.rabbits.find(params[:id])
  @rabbit.destroy
  redirect_to @warren, :flash => { :info => "Rabbit was brutally murdered!" }
end

В качестве альтернативы, я полагаю, вы можете использовать :success / notice:

redirect_to @warren, :success => "Rabbit was brutally murdered!"

Надеюсь, это поможет!

UPDATE

Для сообщений об ошибках вам нужно что-то вроде target.error_messages. Вы можете найти более подробную информацию о настройке вывода здесь .

...