【问题标题】:When to use private method in Rails?什么时候在 Rails 中使用私有方法?
【发布时间】:2016-12-19 23:35:52
【问题描述】:

我不完全确定 Rails 中私有方法的概念,以及何时以及如何使用它。有什么规则吗?私有与公共与受保护之间有什么区别?例如,在下面的示例中,为什么这里使用私有方法而不是其他两种方法。始终对用户生成的输入使用私有方法是最佳做法吗?请赐教。非常感谢!

class PostsController < ApplicationController

def index
  @posts = Post.all.order("created_at DESC")
end

def new
 @post = Post.new
end

def create
 @post = Post.new(post_params)
  if @post.save
 redirect to @post
 else
  render 'new'
 end
end

def show
  @post = Post.find(params[:id])
end

private

def post_params
  params.require(:post).permit(:title, :body)
 end
end

【问题讨论】:

  • Ruby on Rails Web 应用程序是使用 Ruby 编程语言编写的。 private 的概念来源于 Ruby 本身,Rails 并没有给它添加任何特殊含义。 Ruby 从面向对象编程(OOP)领域得到了publicprivate 的概念。因此,我建议您只需查找 OOP 中的 public 和 private 是什么意思,并将 Rails 排除在您的搜索之外。

标签: ruby-on-rails


【解决方案1】:

在 Rails ActionController 上下文中,控制器类的公共方法通过 Rails 路由暴露给 Web 服务器。您可以定义到类的公共方法的路由并将它们用作控制器操作。

但是你不能定义私有方法的路由。它们被设计为内部辅助方法,无法将它们暴露给 Web 服务器。

这导致了控制器中的基本约定:将每个控制器操作定义为公共方法,为每个控制器定义路由,然后定义对应于操作的视图或将每个操作链接到另一个操作或视图。为您的辅助方法或其他组件使用私有方法或其他类。

当然,这些都是约定。如果您确定没有人会定义这些方法的路由或将它们暴露给客户端不会有害(如暴露敏感信息、创建漏洞或只是看起来很傻),您可以将控制器中的所有方法公开。

【讨论】:

  • 感谢您的回答!我对“私有方法”背后的概念以及应该使用该方法的上下文感到困惑。现在一切都说得通了。谢谢你的解释,这很有帮助。
【解决方案2】:

因为通常范围是一件好事。

这是您使用类将方法组合在一起的原因之一。

当这些方法需要作为类级别方法或实例方法调用时,它们需要是公共的。

这也是一个核心 ruby​​ 概念,而不是与 Rails 的任何关系。

但是,当这些方法开始包含大量代码时,最好将详细信息提取到其他方法中,这些方法从类中的公共方法调用。您提取的方法是私有方法。

至于受保护,它更复杂,与继承有关,实际上很少需要。
请参阅单独的问题,例如Why does Ruby have both private and protected methods? 定义类或其子类的任何实例都可以调用受保护的方法。

【讨论】:

  • 感谢您的回答!我现在明白了:)
猜你喜欢
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 2013-08-25
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 2022-01-20
相关资源
最近更新 更多