ruby-on-rails - 从 Rails 模型中访问 c​​urrent_user?

标签 ruby-on-rails ruby model

我正在构建一个基本上遵循以下模式的发票应用程序:

Users < Clients < Projects < Invoices

现在为了为每个用户生成自动递增的发票编号,我将其放入我的 Invoice 中型号:

  before_create :create_invoice_number

  def create_invoice_number
    val = @current_user.invoices.maximum(:number)
    self.number = val + 1
  end

但是,似乎无法从 Rails 的模型中访问 c​​urrent_user 变量?

我该怎么做才能解决这个问题?

最佳答案

这是由于 Rails 中的关注点分离,并且是一个需要处理的有点棘手的问题。在 Rails 范例中,模型除了直接传递的内容外,不应该知道任何应用程序状态,因此大多数 Rails 编码人员会告诉您,任何需要了解 current_user 的模型都是代码味道。

也就是说,有三种方法可以做到这一点,每一种都“更正确”(或者至少我会这样认为)。

首先,尝试在发票中创建与用户的关联,并将发票链接到 Controller 中的用户:

class InvoicesController < ApplicationController

...

def create
  @invoice = current_user.invoices.create(params[:invoice])
  ...
end

在你的模型中:

belongs_to :user

def create_invoice_number
  self.user.invoices.maximum(:number) + 1
end

如果这不起作用,请在 Controller 中手动执行此操作。的确, Controller 应该始终尽可能瘦,但由于这显然是一个应用程序级别的问题,所以 Controller 是放置它的地方:

class InvoicesController < ApplicationController

...

def create
  @invoice = Invoice.create(params[:invoice])
  @invoice.update_attribute(:number, current_user.invoices.maximum(:number))
  ...
end

最后,如果您真的非常想连接 Controller 和模型,您可以使用 ActionController::Sweepers 来实现。 .它们不是为此目的而设计的,但肯定会为您完成工作。

关于ruby-on-rails - 从 Rails 模型中访问 c​​urrent_user?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9400321/

相关文章:

css - Rails 似乎要求我在 CSS 对 Development 生效之前进行预编译

ruby-on-rails - 通过我的 rails 应用程序使用谷歌联系人 API 添加联系人到我的 Gmail 帐户

forms - 如何在 Yii 中用一个表单连接两个表

php - 模型中的错误处理 (MVC)

php - Phalcon 关系顺序

ruby-on-rails - 在 RHEL 6(x86_64 arch) 中使用 rvm 构建 32 位 ruby

css - 样式 Bootstrap 卡标题不起作用

ruby - 如何将十六进制转换为 base64urlsafe?

ruby-on-rails - 从联系表(rails)保存数据

ruby - 使用 RubyXL 加载 Axlsx 创建的文件时读取工作表名称