Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 覆盖';全部';rubyonrails中的一种模型方法_Ruby On Rails - Fatal编程技术网

Ruby on rails 覆盖';全部';rubyonrails中的一种模型方法

Ruby on rails 覆盖';全部';rubyonrails中的一种模型方法,ruby-on-rails,Ruby On Rails,我有一个帐户模型,该模型具有以下列: id :bigint(8) name :string 在app/models/account.rb中,我有: class Account < ApplicationRecord has_one_attached :logo end 上面的代码返回: [ { "id": 1, "name": "Example1" }, { "id": 2, "name": "Example2" } ] 我还想包括

我有一个
帐户
模型,该模型具有以下列:

id :bigint(8)
name :string
app/models/account.rb
中,我有:

class Account < ApplicationRecord
  has_one_attached :logo
end
上面的代码返回:

[
  {
    "id": 1,
    "name": "Example1"
  },
  {
    "id": 2,
    "name": "Example2"
  }
]
我还想包括附加到返回的JSON的
ActiveStorage
文件的url

为了实现这一点,我在控制器中执行以下操作:

def index
  @accounts =  
    Account.all.map do |account|
      account =
        account.attributes.merge(
          :logo_url =>
            account.logo.attached? ?
              polymorphic_url(account.logo) : nil
        )
  end

  render :json => @accounts
end
这将返回:

[
  {
    "id": 1,
    "name": "Example1",
    "logo_url": "/path/to/logo.jpg"
  },
  {
    "id": 2,
    "name": "Example2",
    "logo_url": "/path/to/logo.jpg"
  }
]
但是,我不想在每次调用
帐户时都这样做;每当调用
帐户时,我想自动添加
徽标\u url
。all

我已经想出了这个解决办法;我决定重写模型中的方法,而不是在控制器中调用它。在app/models/account.rb
中,我添加了:

def self.all
  super.map do |account|
    account =
      account.attributes.merge(
        :logo_url =>
          account.logo.attached? ?
            polymorphic_url(account.logo) : nil
      )
  end
end
上面的代码工作得很好。问题在于方法
find
find\u by
where
,以及其他方法停止工作。如果我从
account.rb
中删除
self.all
方法,它会再次工作

以下代码:

Account.find_by :id => params[:id]
Account.find params[:id]
引发错误:

undefined method `where' for #<Array:0x00007fd09b68d670>
的未定义方法“where”#
我相信这是因为
self.all
返回一个数组而不是活动记录


如何覆盖模型中的
all
方法?

我认为您不想覆盖
Account.all
。 相反,您希望更改模型的默认序列化。 试试这个:

class Account < ApplicationRecord

  has_one_attached :logo

  private

  def serializable_hash(options)
    super(options).merge("logo_url" => logo_url)
  end

  def logo_url
    logo.attached? ? polymorphic_url(account.logo) : nil
  end
end
类帐户logo\u url)
结束
def logo_url
logo.attached?多态url(account.logo):无
结束
结束

控制器最终在您的模型上调用
到_json
,并最终使用
#serializable_hash
。由于
to_-son
使用选项设置json的根,所以最好覆盖
serializable_-hash
。另一种方法是为每个模型创建一个单独的序列化器类,但这应该适用于一个简单的情况。

您能说明如何在控制器中实现它吗?我相信它会在控制器中工作,因为控制器会尝试序列化模型并调用
来调用json
,从而调用新代码。
class Account < ApplicationRecord

  has_one_attached :logo

  private

  def serializable_hash(options)
    super(options).merge("logo_url" => logo_url)
  end

  def logo_url
    logo.attached? ? polymorphic_url(account.logo) : nil
  end
end