0

Ruby と Ruby on Rails を学び始めたばかりで、実際に SO について質問しなければならないのはこれが初めてで、本当に腹が立ちます。

イメージの URL を受信して​​データベースに保存する必要がある REST API をプログラミングしています。

このために、Carrierwave を使用してアップロードされた画像を次のように保存する ImageSet というモデルを作成しました。

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

このモデルには、null にできない image_set_id があります。

json を使用した投稿のような単純なリクエストを考えてみます。

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

それは常に与えます:ImageSetを空白にすることはできません。

私はtemp.image_setコンソールからアクセスできますtempTemplate、そこに値を設定することもできます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