回调& params.require - 有人可以向我解释这些吗?

时间:2016-06-13 05:23:41

标签: ruby-on-rails

如果这很愚蠢,我很抱歉,但我不知道下面的代码是什么

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

我是rails的新手,我已经对MVC及其连接方式有了一个相当好的想法,但我无法绕过控制器文件中的上述代码。什么是回调,我为什么要使用?什么是Article.find(params [:id])在做什么?在这种情况下.permit会做什么?这是否意味着它只会接受标题,帖子和帖子user_id参数而不是其他什么?最重要的是,为什么两种方法都是私有的?提前谢谢!

2 个答案:

答案 0 :(得分:0)

  1. 这些操作是私有的,因为我们不想在课堂外访问这些操作。
  2. def set_article   @article = Article.find(params [:id]) 结束 此操作在显示和编辑之前运行,您可以在top_action中查看 它与

    相同 def show @article = Article.find(params [:id]) 结束 我们在编辑和展示中使用相同的东西。所以我们不想重复同样的事情。所以我们把它放在一个动作中。

    1. def article_params params.require(:article).permit(:title,:post,:user_id) 结束 这个动作是接受强大的参数。只有这些参数才允许存储在数据库中

答案 1 :(得分:0)

  • 回调是在对象生命周期的某些点调用的方法。 set_article是一个回调函数,因为它被称为before特定的控制器操作(通常列在文件的顶部)。原因是您需要从数据库中找到article并将其分配给所有这些操作中的实例变量。此方法旨在保持代码DRY(不要重复自己),因为如果您没有私有方法,则必须在方法内复制/粘贴每个控制器操作的行。只要你不需要改变就可以了。这就是为什么使用回调来实现这些方法的好习惯。

  • 如前所述,@article = Article.find(params[:id])在数据库中找到具有特定ID的文章并将其分配给实例变量,以便稍后在视图中呈现它(例如,使用{{1}等等。)

  • article_params方法有什么作用?它需要传递给请求的所有参数。然后检查params的构造。在这种情况下,@article.name它正在等待看似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方法并使用该方法而不是原始参数:Article.find(params[:id]).update_attributes(article_params)

它会自动DROP所有非白名单参数,这意味着article_params只会包含article: { title: "smth", post: "Hacked", user_id: 1}

我希望现在很清楚。

  • 私有方法通常,私有方法是您无法在对象本身之外调用的方法。例如,如果Article有私有方法write您无法执行:

    article = Article.new article.write

但是如果在为Article

定义一些公共方法时使用相同的方法
class Article
 def needs_write
  #Do other stuff
  write
 end

 private

 def write
  puts "private" 
 end
end

然后调用article.needs_write即可,也可以调用write方法。

一开始理解起来有点棘手...... +让你更加困惑 - 实际上,你可以通过send方法直接在对象上调用私有方法,但你不应该担心起初

相关问题