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