2016-06-13 132 views
1

我道歉,如果這是一個愚蠢的,但我不知道下面這段代碼確實回調&params.require - 有人可以向我解釋這些嗎?

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 

我新的軌道,我已經得到了MVC的一個相當不錯的主意,這一切是如何相連,但是我無法將上述代碼包裹在控制器文件中找到的上面的代碼中。什麼是回調,爲什麼我會用一個?什麼是Article.find(params [:id])在幹什麼? .permit在這種情況下做什麼?這是否意味着它只會接受標題,發佈& user_id參數,而不是其他任何內容?最重要的是,爲什麼這兩種方法都是私有的?提前致謝!

回答

0
  • 回調是被稱爲在對象的生命週期中的一些點的方法。 set_article是一個回調函數,因爲它被稱爲before特定的控制器操作(通常列在文件頂部)。原因是您需要從數據庫中找到article,並將其分配給所有這些操作中的實例變量。這個方法是爲了讓代碼保持乾燥(不要重複自己),因爲如果你沒有一個私有的方法,你將不得不復制/粘貼每個控制器動作的方法。這很好,只要你不需要改變它即可。這就是爲什麼對這些類型的方法使用回調是很好的做法。

  • 如前所述,@article = Article.find(params[:id])在數據庫中找到一篇具有特定ID的文章,並將其分配給一個實例變量,以便稍後在視圖中使用它(例如使用@article.name等)。

  • article_params方法做什麼?它需要傳遞給請求的所有參數。然後檢查參數的構造。在這種情況下,params.require(:article).permit(:title, :post, :user_id)它正在等待看起來像article: { title: "smth", param2: "val2" }等的參數。這就是.require(:article)所做的。 permit所做的除外,其他params除了您已列入白名單外。

一個例子:

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

而且比方說,一個黑客正在試圖改變禁止的屬性和發送這樣article: { title: "smth", post: "Hacked", user_id: 1, admin_id: 1(hackers user_id) }

的請求。如果你這樣做Article.find(params[:id]).update_attributes(params[:article])它會嘗試寫數據庫ALLL已傳遞的參數。

如果你有article_params方法,你用這個來代替原PARAMS:Article.find(params[:id]).update_attributes(article_params)

它會自動下降所有非白名單的參數,可以意味着article_params將只包含article: { title: "smth", post: "Hacked", user_id: 1}

我希望這是明確的現在。

  • 私有方法一般私有方法是,你不能在對象本身之外調用方法。例如,如果Article擁有的私有方法write你不能做:

    article = Article.new article.write

但是如果定義一些公共法條時,可以使用相同的方法

class Article 
def needs_write 
    #Do other stuff 
    write 
end 

private 

def write 
    puts "private" 
end 
end 

然後調用article.needs_write會工作,並且還會調用write方法。

最初理解起來有點棘手... +讓你更加困惑 - 事實上,你可以通過send方法直接在對象上調用私有方法,但你不應該擔心這個方法

0
  1. 這些操作是私人的,因爲我們不想在課堂以外訪問這些操作。
  2. 高清set_article @article = Article.find(PARAMS [:編號]) 結束 這個動作演出前運行,編輯,你可以看到在頂部before_action 是一樣

    高清顯示 @article = Article.find(params [:id]) end 我們在編輯和顯示中使用相同的東西。所以我們不想重複同樣的事情。所以我們把它放在一個行動中。

  3. DEF article_params params.require(:文章).permit(:標題,:交,:USER_ID) 端 這個動作是接受強參數。只有這些參數將允許DATABSE存儲