2010-12-09 10 views
1

Dies ist ein dummes Beispiel, aber ich versuche zu verstehen, wie Dinge hinter den Kulissen in Rails weitergegeben werden. Und es gibt wahrscheinlich einen besseren, "Rails", eine Art, sich dem zu nähern ... wenn ja, lass es mich wissen. Ich habe:Rails: Verlieren Flash/Fehler von eingebetteten Formular nach redirect_to

Warren has_many Rabbits 
Rabbit belongs_to Warren 

Ich listet vorhandene Kaninchen und dann ein Formular für das Hinzufügen eines neuen Kaninchens.

warrens/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 

Es funktioniert. Ich kann Hasen hinzufügen und zerstören, während ich die Show des Warren schaue. Das Problem ist, dass die Flash Nachrichten (:success, :notice) und/oder die rabbit.errors nicht auf/in der Ansicht angezeigt werden. Jetzt bin ich nicht mit accepts_nested_attributes_for in meinem warren.rb-Modell. aber das ist meist arbeiten. Lernen Rails so fragen, was auf und geht, wie meine Nachrichten sanft fließende bekommen ...

Kaninchen/_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' 

Layouts/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 

shared/_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

Ich sehe nicht, wo Sie Flash-Nachrichten einstellen ... Sollte in Kaninchen-Controller.rb sein. – Brian

+0

yup! hab das jetzt. Vielen Dank! kämpft immer noch mit den ** Fehlermeldungen **. – Meltemi

Antwort

2

Es scheint, dass Sie die Flash-Mitteilungen in Ihrem Controller nicht setzen. Versuchen Sie Folgendes:

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 

Alternativ glaube ich Sie :success/notice verwenden:

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

hoffe, das hilft!

UPDATE

Für Ihre Fehlermeldungen, müssen Sie so etwas wie target.error_messages. Weitere Informationen zum Anpassen der Ausgabe finden Sie unter here.

+0

danke! es tut! Lernen und mit so viel los, habe ich einfach vergessen zu spezifizieren: Flash. Vielen Dank! Nun eine Idee **, wie die Fehlermeldungen (.errors) zu erfassen und anzuzeigen? ** Problem eindeutig mit temporären @ vendor.items.build Objekt verwendet wird, um das Formular zu erstellen ... aber wenn Hasen-Controller-Methode schlägt die Validierung fehl, kann ich ' t herausfinden, wie man die Fehler erhält?!? – Meltemi

+0

Ich habe meine Antwort aktualisiert. – Brian

+0

Ich benutze Rails 3 und bekomme "undefined method" für 'error_messages' und Deprecation Warnungen für' error_messages_for'!?! Nicht sicher, warum sie noch in den Rails 3-Dokumenten sind? Sagt, dass Sie ein Plugin installieren müssen, um sie zurück zu bekommen. Wenn ich sie nicht falsch benutze, frage ich mich, was der "Rails 3 Way" (ha!) Ist? – Meltemi