由于carrierwave gem而模型空白 - nested_attributes

时间:2013-09-03 16:45:39

标签: ruby-on-rails ruby carrierwave

我刚刚开始学习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接收,因此setter覆盖,并且它们不能为null。 我的上传程序类正在创建一些带有扩展名白名单和覆盖full_name的版本。

然后,我有这个模板类,它接收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不能为null。

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

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

总是给出:ImageSet不能为空。

如果temp.image_settemp,我可以从控制台访问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
(...)

希望你能给我这个提示。

谢谢!

1 个答案:

答案 0 :(得分:0)

  1. accepts_nested_attributes与belongs_to无法正常工作。

    在某些情况下可能会被欺骗,但你最好在其他地方更改你的应用程序,以“轨道方式”做事。

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

    您可以做的最简单的事情是切换关系,因此模板has_one :image_set和ImageSet belongs_to :template。否则你将不得不写一些相当奇怪的控制器逻辑来按预期处理params。