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