2016-08-18 2 views
1

Ich befolge derzeit ein Tutorial auf Schienen und der Instruktor erklärt die meisten Dinge bisher sehr gut. Zur Zeit lehrt er uns, wie wir unsere eigenen Formulare erstellen, um sie von Grund auf der Datenbank hinzuzufügen, aber ich bin irgendwie verwirrt, was article_params in unserem Code unten tut, Hier ist der vollständige Code in der articles_controller.rb Datei, die unsere behandelt FormAktualisieren und Erstellen eines Formulars in Rails (Code verstehen)

class ArticlesController < ApplicationController 
    def new 
    @article = Article.new 
    end 
    def create 
    @article = Article.new(article_params) 
    render plain: article[:id].inspect 
    if @article.save 
     flash[:notice] = "Article was sucessfully created" 
     redirect_to article_path(@article) 
    else 
     render 'new' 
    end 
    end 

    def show 
    @article = Article.find(params[:id]) 
    end 

    def edit 
    @article = Article.find(params[:id]) 
    end 

    def update 
    @article = Article.find(params[:id]) 
    if @article.update(article_params) 
     flash[:notice] = "Article was sucessfully updated" 
     redirect_to article_path(@article) 
    else 
     render 'edit' 
    end 
    end 


    private 
    def article_params 
    params.require(:article).permit(:title,:description) 
    end 
end 

ich verstehe, was wir zum größten Teil tun, aber wenn ich das Update und erstellen Aktionen haben, was ist die private Methode article_params hier? Der Lehrer sagt, dass es für die weiße Liste verwendet wird und fährt fort, mehrere Dinge zu sagen, die ich wirklich nicht verstehen kann. Zum Beispiel warum haben wir if @article.update(article_params), aber nicht if @article.save(article_params)? Wie Sie sehen können, bin ich ziemlich verwirrt darüber.

Vielen Dank!

Antwort

1

Kurz gesagt, Sie wollen nicht akzeptieren jeden Wert kommen durch die Leitung.

Wenn Sie mit Benutzereingaben zu tun haben, sollten Sie vorsichtig sein, die erforderlichen Parameter auf die weiße Liste zu setzen.

Die article_params stellt sicher, dass Sie nur bestimmte Attribute zulassen, die für mass assignment erforderlich sind. Nehmen wir an, Sie haben ein admin Feld, das ein boolean ist (die nicht von jedem Standard-Benutzer geändert sollte), und wenn Sie

User.create(params[:article]) 

tun, ohne die Werte zu beobachten der Benutzer an den Server sendet, können Sie versehentlich zulassen, dass Benutzer ein Administrator sein. Sieht wie ein schwaches Beispiel aus, kann aber passieren, wenn Sie nicht vorsichtig sind.

In Ihrem Code, die article_params Methode gibt einen Hash, der nur Schlüssel title und description und filtert den Rest von Schlüssel-Wert-Paare haben wird.

Um zu visualisieren, was tatsächlich von einer form empfangen wurde, ersetzen Sie Ihre create Aktion durch die folgenden. Entfernen Sie zuvor description von den zulässigen Parametern in der Methode article_params.

def create 
    render text: params 
end 

Jetzt, wenn Sie versuchen, ein Formular zu erstellen, können Sie die empfangenen Werte finden. Sie können auch die Werte in den Serverprotokollen sehen, aber dies ist der einfachste Weg.

Und dann ersetzen Sie create method mit

def create 
    render text: article_params 
end 

Sie finden, dass das erste Verfahren description zeigen, aber diese wird nicht, wie sie es herausfiltert.

Aus der Dokumentation,

Aktion Reglerparameter

Hier können Sie die für die Massenaktualisierung der weißen Liste werden Attribute wählen sollten und somit verhindern, versehentlich das Aussetzen, die nicht ausgesetzt werden sollte. Bietet zwei Methoden für diesen Zweck: require und permit. Erstere wird verwendet, um Parameter wie erforderlich zu markieren.Letzteres wird verwendet, um den Parameter als zulässig zu setzen und zu begrenzen, welche Attribute für die Massenaktualisierung zugelassen werden sollen.

Um die Differenz zwischen save und update zu verstehen, lesen http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-save

http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update

hoffe, das hilft!

+0

Gibt es einen bestimmten Grund, warum es privat ist? –

+1

@cresjoy Seine private Ursache, die Sie nie aus anderen Klassen nennen werden. Bedeutung, es wird intern in der Klasse verwendet und darf nicht von den anderen Klassen konsumiert werden. Aus der Dokumentation: "Die Verwendung einer privaten Methode zum Einkapseln der zulässigen Parameter ist nur ein gutes Muster, da Sie die gleiche Liste zwischen Erstellungs- und Aktualisierungsrechten wiederverwenden können. Sie können diese Methode auch mit benutzerspezifischen Überprüfungen spezialisieren zulässiger Attribute. " –

+0

Danke für die Erklärung. Ich glaube, ich verstehe, aber ich erinnere mich, dass ich in einer meiner .erb-Dateien eine Bedingung hatte, die besagt, dass @ articles.errors.any? Zeigen Sie dann die Fehler an. Ich gehe davon aus, dass diese article_params es intern handhabt und dass meine if-Anweisung es nur auf dem Bildschirm anzeigt. –

Verwandte Themen