在父控制器中创建嵌套模型的实例

时间:2016-01-18 18:56:21

标签: ruby-on-rails-4 paperclip

我想知道是否可以在父控制器中创建嵌套模型的实例。

让我解释一下。我有一个名为博物馆的模型和另一个名为Museumimage的模型。 Museumimage只有一个字段是附件,由 Paperclip gem管理。我为此创建了一个单独的模型,因为可以根据需要链接到博物馆模型。我认为这比创建博物馆模型的20个附件字段更好......大多数都是空的..

然后在新视图中,我有一个表单,允许同时添加博物馆实例和某些文件字段的信息。

以下是我的观点:

<%= form_for :museum, url: museums_path do |f| %>
<p>
  <%= f.label :name %><br>
  <%= f.text_field :name %>    </p>
....
<%= f.file_field :image %><br>

(有些参数如:名称属于博物馆模型,而且:图像为第二个嵌套模型Museumimage)

我做了一个非常简单的控制器,CREATE重要位是:

@museum = Museum.new(museum_params)
@museum.save
@image = @museum.museumimages.create(image_params)
redirect_to @museum

(目前为一张图片)

虽然我收到错误: ActionController :: MuseumsController中的ParameterMissing #create

这是我第一次尝试Paperclip。

我的问题:

  • 是否可以在父项内的嵌套模型上创建实例 控制器?
  • 如果可以,我想我的代码有缺陷。直觉我觉得 我的表单助手应该引用嵌套模型 :museumimage呢?

编辑 编辑 编辑

我找到了一个表单助手FIELDS_FOR的解决方案的开头。

<%= f.fields_for :museumimages do |museumimages_fields| %>
  Image: <%= museumimages_fields.file_field :image %>
    <% end  %>

但我仍然收到错误消息 param缺失或值为空:museumimages

app/controllers/museums_controller.rb:191:in `image_params'
app/controllers/museums_controller.rb:129:in `create'

"museumimages"=>{"image"=>#<ActionDispatch::Http::UploadedFile:0x475bca8@tempfile=#<Tempfile:C:/Users/Maxence/AppData/Local/Temp/RackMultipart20160118-8768-obyvra.JPG>,
@original_filename="DSC07825.JPG",
@content_type="image/jpeg",
@headers="Content-Disposition: form-data; name=\"museum[museumimages][image]\"; filename=\"DSC07825.JPG\"\r\nContent-Type: image/jpeg\r\n">}},

我认为我的控制器位不正确。

Def Create 
...
@image = @museum.museumimages.new(image_params)
@image.save
end

def image_params
params.require(:museumimages).permit(:image)
end

1 个答案:

答案 0 :(得分:0)

您需要查看accept nested attributes method,这样模型将允许保存实例,然后在方法getChoices()中,您需要以数组形式添加额外的参数,本案例params.require(:museum).permit(:name,museumimages:[:image])

这应该可以解决问题