2009-01-08 12 views
6

Ich arbeite an einer Rails-App, die Daten über ein Formular sendet. Ich möchte einige der "Parameter" des Formulars ändern nach das Formular sendet, aber vor es verarbeitet wird.Rails: Ändern der Formularparameter vor dem Ändern der Datenbank

Was ich jetzt

{"commit"=>"Create", 
    "authenticity_token"=>"0000000000000000000000000" 
    "page"=>{ 
    "body"=>"TEST", 
    "link_attributes"=>[ 
     {"action"=>"Foo"}, 
     {"action"=>"Bar"}, 
     {"action"=>"Test"}, 
     {"action"=>"Blah"} 
    ] 
    } 
} 

Was ich will

{"commit"=>"Create", 
    "authenticity_token"=>"0000000000000000000000000" 
    "page"=>{ 
    "body"=>"TEST", 
    "link_attributes"=>[ 
     {"action"=>"Foo", 
     "source_id"=>1}, 
     {"action"=>"Bar", 
     "source_id"=>1}, 
     {"action"=>"Test", 
     "source_id"=>1}, 
     {"action"=>"Blah", 
     "source_id"=>1}, 
    ] 
    } 
} 

haben Ist das machbar? Im Grunde versuche ich zwei Arten von Daten gleichzeitig zu übermitteln ("page" und "link") und weise die "source_id" der "links" der "id" der "Seite" zu.

Antwort

15

Bevor es an die Datenbank übergeben wird, können Sie Code in den Controller schreiben, der die Parameter übernimmt und vor dem Speichern unterschiedliche Informationen anfügt. Zum Beispiel:

FooController < ApplicationController 

    def update 
    params[:page] ||= {} 
    params[:page][:link_attributes] ||= [] 
    params[:page][:link_attriubtes].each { |h| h[:source_id] ||= '1' } 
    Page.create(params[:page]) 
    end 

end 
+0

Anything specific? –

+0

Ich kann das Beispiel von Gaius nicht abstimmen .. aber ja, das –

+0

Nein, aber seltsamerweise kann ich deine Antwort, die ich bearbeitet habe, verbessern. –

2

Sie sollten auch bei Rückrufe aussehen wahrscheinlich, speziell before_validate (wenn Sie Validierungen verwenden), BEFORE_SAVE oder before_create.

Es ist schwierig, Ihnen ein konkretes Beispiel zu geben, wie man sie benutzt, ohne zu wissen, wie Sie die Daten speichern, aber es würde wahrscheinlich dem Beispiel sehr ähneln, das Gaius gab.

2

bearbeiten params vor verwenden Sie starke params

Ok, also (Wiederbelebung dieser alten Frage) ich damit eine Menge Ärger hatte, wollte ich einen param ändern, bevor es das Modell erreicht (und starke params halten) . Ich fand es schließlich heraus, hier ist die Grundlagen:

def update 
    sanitize_my_stuff 
    @my_thing.update(my_things_params) 
end 

private 

def sanitize_my_stuff 
    params[:my_thing][:my_nested_attributes][:foo] = "hello" 
end 

def my_things_params 
    params.permit(etc etc) 
end 
Verwandte Themen