2016-06-13 19 views
1

ich entschuldige mich, wenn dies eine dumme, aber ich habe keine Ahnung, was das folgende Stück Code tutCallbacks & params.require - Kann mir das jemand erklären?

private 
# Use callbacks to share common setup or constraints between actions. 
def set_article 
    @article = Article.find(params[:id]) 
end 

# Never trust parameters from the scary internet, only allow the white list through. 
def article_params 
    params.require(:article).permit(:title, :post, :user_id) 
end 
end 

Ich bin neu auf Schienen, und ich habe eine ziemlich gute Vorstellung von MVC und wie sie alle Connects bekommen, aber ich kann meinen Kopf nicht um den oben in den Controller-Dateien gefundenen Code wickeln. Was ist ein Rückruf und warum sollte ich einen verwenden? Was macht Article.find (params [: id])? Was macht .permit in diesem Fall? Bedeutet es, dass es nur den Titel akzeptiert, post & user_id Parameter und nichts anderes? Und warum sind beide Methoden privat? Danke im Voraus!

Antwort

0
  • Rückrufe Methoden, die an einigen Stellen des Objekts Lebenszyklus aufgerufen werden. set_article ist ein Rückruf, weil es before besondere Controller-Aktionen (in der Regel oben auf der Datei aufgeführt) genannt wird. Der Grund dafür ist, dass Sie einen article aus der Datenbank finden und ihn in allen diesen Aktionen einer Instanzvariablen zuweisen müssen. Diese Methode soll den Code DRY (Do not Repeat Yourself) beibehalten, denn wenn Sie keine private Methode dafür haben, müssten Sie die Zeile innerhalb der Methode für jede Controller-Aktion kopieren/einfügen. Das ist in Ordnung, solange Sie es nicht immer ändern müssen. Aus diesem Grund empfiehlt es sich, Rückrufe für diese Methoden zu verwenden.

  • Wie bereits erwähnt @article = Article.find(params[:id]) einen Artikel in der Datenbank mit einer bestimmten ID findet und ordnet sie einer Instanzvariablen, so dass Sie es später in einer Ansicht darstellen kann (unter Verwendung von, sagen wir, @article.name usw.).

  • Was macht die article_params-Methode? Es dauert ALLE Parameter, die an die Anfrage übergeben werden. dann in Prüfungen für den Aufbau der Params. In diesem Fall params.require(:article).permit(:title, :post, :user_id) wartet es auf Params, die aussehen wie article: { title: "smth", param2: "val2" } usw. Das ist, was .require(:article) tut. Was permit tut, ist alle anderen params fallen außer denen, die Sie auf der weißen Liste haben.

Ein Beispiel:

def article_params 
    params.require(:article).permit(:title, :post, :user_id) 
end 

Und lassen Sie uns ein Hacker sagen versucht verboten Attribute zu ändern und sendet eine Anfrage wie diese article: { title: "smth", post: "Hacked", user_id: 1, admin_id: 1(hackers user_id) }

Wenn Sie Article.find(params[:id]).update_attributes(params[:article]) tun würde es das schreiben versuchen Datenbank ALLL die Params, die übergeben wurden.

Wenn Sie die article_params Methode haben und Sie, dass anstelle von rohem params: Article.find(params[:id]).update_attributes(article_params)

Es wird automatisch alle nicht-weißen Liste params DROP, was bedeutet, dass article_params nur article: { title: "smth", post: "Hacked", user_id: 1}

enthalten Ich hoffe, das ist klar, jetzt.

  • Private Methoden Im Allgemeinen private Methoden sind Methoden, die Sie nicht außerhalb des Objekts selbst aufrufen können. Zum Beispiel, wenn Article eine private Methode hat write Sie können nicht tun:

    article = Article.new article.write

Aber wenn Sie die gleiche Methode verwenden, wenn eine öffentliche Methode für Artikel

class Article 
def needs_write 
    #Do other stuff 
    write 
end 

private 

def write 
    puts "private" 
end 
end 

Dann ruft article.needs_write definieren würde arbeiten und würden auch die write Methode aufrufen.

Es ist ein bisschen schwierig zu verstehen, auf den ersten ... +, Sie verwirrter zu machen - Sie können tatsächlich eine private Methode direkt auf Objekt über send Methode aufrufen, aber Sie sollten sich nicht darüber zuerst kümmern

0
  1. Diese Aktionen sind privat, weil wir nicht auf diese Aktionen außerhalb der Klasse zugreifen möchten.
  2. set_article def @article = Article.find (params [: id]) Ende diese Aktion vor Show läuft und bearbeiten Sie oben before_action sehen es ist die gleiche wie

    zeigen def @article = Article.find (params [: id]) Ende wir verwenden das gleiche in Edit und Show. also wollen wir das gleiche nicht nochmal wiederholen. Also haben wir es in eine Aktion gebracht.

    1. def params.require article_params (allgemein: Artikel) .permit (Titel, Post,: user_id) Ende diese Aktion stark Parameter akzeptieren. nur diese Parameter erlauben in databse speichern

Verwandte Themen