0

我刚刚开始学习 Ruby 和 Ruby on Rails,这实际上是我第一次真正要问关于 SO 的问题,真的让我很生气。

我正在编写一个 REST api,我需要在其中接收图像 url 并将其存储在我的数据库中。

为此,我做了一个名为 ImageSet 的模型,它使用carrierwave 来存储上传的图像,如下所示:

class ImageSet < ActiveRecord::Base
  has_one :template

  mount_uploader :icon1, Icon1Uploader
  mount_uploader :icon2, Icon2Uploader

  def icon1=(url)
    super(url)
    self.remote_icon1_url = url
  end

  def icon2=(url)
    super(url)
    self.remote_icon2_url = url
  end
end

此 icon1 和 icon2 都作为 url 接收,因此设置器覆盖,它们不能为空。我的上传器类正在创建一些带有扩展白名单和覆盖全名的版本。

然后,我有这个模板类,它接收 ImageSet 的嵌套属性。

class Template < ActiveRecord::Base
  belongs_to :image_set

  accepts_nested_attributes_for :image_set

  (other stuff)

  def image_set 
    super || build_image_set
  end
end

此模型有一个不能为空的 image_set_id。

考虑一个简单的请求,比如带有 json 的帖子:

   {
   "template":
      {
      "image_set_attributes":
         {
         "icon1": "http....",
         "icon2": "http...."
         }
      }
   }

它总是给出:ImageSet 不能为空。

我可以temp.image_set从控制台访问 if tempis a Template,我也可以在那里设置值,比如,temp.image_set.icon = 'http...'但我似乎无法弄清楚为什么它会在那里中断。它应该创建 image_set,将其属性设置为保存模板类,模板类会将其 id 分配给其自己模型中的相应列-

我的控制器正在做:

(...)
def create
 @template = Template.create(params)
 if @template
   render status: 200
 else
   render status: 422
 end
end

private

def params
 params.require(:template).permit(image_set_attributes: [:id, :icon1, :icon2])
end
(...)

希望你能给我这个建议。

谢谢!

4

1 回答 1

0
  1. Accept_nested_attributes 不能按预期与 belongs_to 一起工作。

    它可以被欺骗在某些情况下工作,但您最好在其他地方更改您的应用程序以按照“rails 方式”执行操作。

  2. 模板validate_presence_of :image_set,对吧?如果是这样,问题是这意味着 ImageSet 必须始终在其模板之前创建,但accepts_nested_attributes认为模板是父级,并试图先保存父级。

    您可以做的最简单的事情是切换关系,即 Templatehas_one :image_set和 ImageSet belongs_to :template。否则,您将不得不编写一些相当奇怪的控制器逻辑来按预期处理参数。

于 2013-09-03T21:32:24.523 回答