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
コンソールからアクセスできますtemp
が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
(...)
これについてのヒントを教えていただければ幸いです。
ありがとう!