如果这很愚蠢,我很抱歉,但我不知道下面的代码是什么
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参数而不是其他什么?最重要的是,为什么两种方法都是私有的?提前谢谢!
答案 0 :(得分:0)
def set_article @article = Article.find(params [:id]) 结束 此操作在显示和编辑之前运行,您可以在top_action中查看 它与
相同 def show @article = Article.find(params [:id]) 结束 我们在编辑和展示中使用相同的东西。所以我们不想重复同样的事情。所以我们把它放在一个动作中。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
方法直接在对象上调用私有方法,但你不应该担心起初