Rails 嵌套属性未使用载波保存
Rails nested attributes not saving using 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=#<Tempfile:C:/Users/Lee/AppData/Local/Temp/RackMultipart20170513-2604-b2lnrz.jpg>, @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
....
画廊控制器
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
中部分渲染
<%= form_for @gallery do |f| %>
<div class="field">
<%= f.label :name %>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :cover %>
<%= f.text_field :cover %>
</div>
<div id="pictures">
<%= f.fields_for @gallery.pictures do |pic| %>
<%= pic.file_field :picture %>
</div>
<% end %>
<div id="submit">
<%= f.submit %>
</div>
<% end %>
模特、画廊
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
根据此处的参数行判断:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"LACaMz44B9mn/psLYjzs8qrwo9mr0l2OEIPg+VmCn9CdbGhBh9rDUJ6FE0EOwKCj7aZVjbM4+t0YoaFIRX7IEA==",
"gallery"=>{"name"=>"Hello", "cover"=>"123456",
"picture"=>{"picture"=>#<ActionDispatch::Http::UploadedFile:0xb943d50
@tempfile=#<Tempfile:C:/Users/Lee/AppData/Local/Temp/RackMultipart20170513-2604-b2lnrz.jpg>,
@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
Unpermitted parameter: picture
错误是因为你的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 %>
我可以获取要插入的图库属性,如下面的服务器日志所示,但图片属性也不会插入。
服务器响应
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=#<Tempfile:C:/Users/Lee/AppData/Local/Temp/RackMultipart20170513-2604-b2lnrz.jpg>, @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
....
画廊控制器
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
中部分渲染<%= form_for @gallery do |f| %>
<div class="field">
<%= f.label :name %>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :cover %>
<%= f.text_field :cover %>
</div>
<div id="pictures">
<%= f.fields_for @gallery.pictures do |pic| %>
<%= pic.file_field :picture %>
</div>
<% end %>
<div id="submit">
<%= f.submit %>
</div>
<% end %>
模特、画廊
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
根据此处的参数行判断:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"LACaMz44B9mn/psLYjzs8qrwo9mr0l2OEIPg+VmCn9CdbGhBh9rDUJ6FE0EOwKCj7aZVjbM4+t0YoaFIRX7IEA==",
"gallery"=>{"name"=>"Hello", "cover"=>"123456",
"picture"=>{"picture"=>#<ActionDispatch::Http::UploadedFile:0xb943d50
@tempfile=#<Tempfile:C:/Users/Lee/AppData/Local/Temp/RackMultipart20170513-2604-b2lnrz.jpg>,
@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
Unpermitted parameter: picture
错误是因为你的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 %>