Rails嵌套属性不使用carrierwave保存

我可以通过下面的服务器日志显示插入的库属性,但图片属性也不会插入。

服务器响应

Started POST "/galleries" for 127.0.0.1 at 2017-05-13 18:19:23 +1000 Processing by GalleriesController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"LACaMz44B9mn/psLYjzs8qrwo9mr0l2OEIPg+VmCn9CdbGhBh9rDUJ6FE0EOwKCj7aZVjbM4+t0YoaFIRX7IEA==", "gallery"=>{"name"=>"Hello", "cover"=>"123456", "picture"=>{"picture"=>#<ActionDispatch::Http::UploadedFile:0xb943d50 @tempfile=#, @original_filename="Skateboard 1.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"gallery[picture][picture]\"; filename=\"Skateboard 1.jpg\"\r\nContent-Type: image/jpeg\r\n">}}, "commit"=>"Create Gallery"} Unpermitted parameter: picture (0.0ms) begin transaction SQL (1.0ms) INSERT INTO "galleries" ("name", "cover", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["name", "Hello"], ["cover", 123456], ["created_at", 2017-05-13 08:19:23 UTC], ["updated_at", 2017-05-13 08:19:23 UTC]] (65.1ms) commit transaction Redirected to http://localhost:3000/ Completed 302 Found in 74ms (ActiveRecord: 66.1ms) Started GET "/" for 127.0.0.1 at 2017-05-13 18:19:23 +1000 .... 

GalleriesController

 class GalleriesController < ApplicationController def new @gallery = Gallery.new end def create @gallery = Gallery.new(gallery_params) if @gallery.save flash[:success] = "Picture created!" redirect_to root_url else render 'new' end end private def gallery_params params.require(:gallery).permit(:id, :name, :cover, pictures_attributes: [:id, :gallery_id, :picture, :_destroy]) end end 

_form.html.erb部分从new.html.erb中呈现

  

模特,画廊

 class Gallery < ApplicationRecord has_many :pictures validates :name, presence: true validates :cover, presence: true accepts_nested_attributes_for :pictures, allow_destroy: true end 

图片

  class Picture < ApplicationRecord belongs_to :gallery validates :gallery_id, presence: true validates :picture, presence: true mount_uploader :picture, PictureUploader serialize :picture, JSON end 

迁移,图库

 class CreateGalleries < ActiveRecord::Migration[5.0] def change create_table :galleries do |t| t.string :name t.integer :cover t.timestamps end end end 

图片

 class CreatePictures < ActiveRecord::Migration[5.0] def change create_table :pictures do |t| t.integer :gallery_id t.string :picture t.timestamps end end end 

未允许的参数:图片

错误是因为您的fields_for错误。 fields_for第一个参数应该是record_name (在您的情况下应该是:pictures )。

fields_for(record_name,record_object = nil,options = {},&block)

您正在将record_object作为第一个参数传递,这会导致错误的参数并导致不允许的错误 。 将代码更改为以下内容可解决此问题。

 <%= f.fields_for :pictures, @gallery.pictures do |pic| %> <%= pic.file_field :picture %> <% end %> 

根据您的参数来判断:

 Parameters: {"utf8"=>"✓", "authenticity_token"=>"LACaMz44B9mn/psLYjzs8qrwo9mr0l2OEIPg+VmCn9CdbGhBh9rDUJ6FE0EOwKCj7aZVjbM4+t0YoaFIRX7IEA==", "gallery"=>{"name"=>"Hello", "cover"=>"123456", "picture"=>{"picture"=>#, @original_filename="Skateboard 1.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"gallery[picture][picture]\"; filename=\"Skateboard 1.jpg\"\r\nContent-Type: image/jpeg\r\n">}}, "commit"=>"Create Gallery"} 

你得到结果的事实是: Unpermitted parameter: picture ,你应该将你的强参数改为

 def gallery_params params.require(:gallery).permit(:id, :name, :cover, picture: [:id, :gallery_id, :picture, :_destroy]) end