2016-06-13 130 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存储