我想以嵌套形式使用神社的宝石, 但是发生了
不允许的参数::photos_attributes
如何解决? 我尝试了一些方法,
def blog_form_params
params.require(:blog_form).permit(:title,:content ).merge!(user_id: current_user.id,:photos_attributes =>[:image,:id,:destroy ])
end
和
def blog_form_params
params.require(:blog_form).permit(:title,photos_attributes: {:image,:destroy })
end
等等,但是我无法解决这个错误是什么问题? 请告诉我如何解决
强大的参数
def blog_form_params
params.require(:blog_form).permit(:title,:content ).merge!(user_id:
current_user.id,photos_attributes: [:image,:destroy ])
end
BlogForm.rb
class BlogForm
include activeModel::Model
attr_accessor :title,:content,:user_id,:photos
def blog_builder
@user = User.find(user_id)
@blogs = @user.blogs.create(title: title,content: content )
return @blogs
end
concerning :PhotosBuilder do
attr_reader :photos_attributes
def photos
@blogs = blog_builder
@photos ||= @blogs.photos.new
end
def photos_attributes=(attributes)
@blogs = blog_builder
@photos ||= @blogs.photos.new(attributes)
end
end
def build_association
@user.photos << @photos if @photos != nil
end
def save
return false if invalid?
blog_builder
@blogs.save
@photos.save if @photos != nil
build_association
end
end
发送参数
{"authenticity_token"=>"qDssddHt4EhfFWN33SPMk2F5fcvPToh143hrwilw0p98HK2RMEwdKDF7QsGYiSQ7AQHN02lpdBaCbSAed80Swg==","blog_form"=>{"title"=>"","content"=>"sample","photos_attributes"=>
{"image"=>#<actionDispatch::Http::UploadedFile:0x00007f92408f07a8 @
tempfile=#<Tempfile:/tmp/RackMultipart20200406-4102-1x3utj1.png>,@original_filename="p8-1.png",@content_type="image/png",@headers="Content-Disposition: form-data;
name=\"blog_form[photos_attributes][image]\"; filename=\"p8-
1.png\"\r\nContent-Type: image/png\r\n">}},"commit"=>"create","user_id"=>"2"}
blog.rb
class Blog < ApplicationRecord
belongs_to :user
has_many :photos
validates :title,presence: true
validates :content,presence: true
end
photo.rb
class Photo < ApplicationRecord
belongs_to :blog
belongs_to :user
include ImageUploader[:image]
end
uploader.rb
class ImageUploader < Shrine
end
shrine.rb
require "shrine/storage/file_system"
Shrine.storages = {
cache: Shrine::Storage::FileSystem.new("public",prefix: "uploads/cache"),# temporary
store: Shrine::Storage::FileSystem.new("public",prefix: "uploads/store"),# permanent
}
Shrine.plugin :activerecord
Shrine.plugin :cached_attachment_data
blogs_controller
def new
@blog_form = BlogForm.new
end
def create
@blog_form = BlogForm.new(blog_form_params)
if @blog_form.save
redirect_to user_blogs_path
else
#False action
end
end
def blog_form_params
params.require(:blog_form).permit(:title,photos_attributes:
[:image] ).merge!(user_id: current_user.id)
end
我可以解决这个问题, 相反,我无法合并user_id 然后发生了activeRecord :: RecordNotFound(找不到没有ID的用户):
def blog_builder
@user = User.find(user_id)#Here is a new problem
@blogs = @user.blogs.create(title: title,content: content )
return @blogs
end
也许我可以发送参数
(byebug) blog_form_params
<actionController::Parameters {"title"=>"","photos_attributes"=><actionController::Parameters {"image"=>#
<actionDispatch::Http::UploadedFile:0x00007f9240bc77b0 @tempfile=#
<Tempfile:/tmp/RackMultipart20200406-4102-rc9eo6.png>,@headers="Content-Disposition: form-data;
name=\"blog_form[photos_attributes][image]\"; filename=\"p8-
1.png\"\r\nContent-Type: image/png\r\n">} permitted: true>,"user_id"=>2}
permitted: true>
所以错误归因于形成对象
我上传了blog_form.rb
def blog_builder
@user = User.find(params[:user_id])#previously User.find(user_id)
@blogs = @user.blogs.create(title: title,content: content )
return @blogs
end
不起作用,我进入了(byebug)params [:user_id] *** NameError异常:#
的未定义局部变量或方法'params'无
我更改了user_id而不是params [:user_id] 这样
(byebug) @blog_form.user_id=params[:user_id]
NoMethodError Exception: undefined method `user_id=' for nil:NilClass
nil
创建
def create
@blog_form = BlogForm.new(blog_form_params)
@blog_form.user_id=params[:user_id]
if @blog_form.save
博客表格
def blog_builder
@user = User.find(user_id)
@blogs = @user.blogs.create(title: title,content: content )
return @blogs
end
blog_form_params
(byebug) blog_form_params
<actionController::Parameters {"title"=>"title","photos_attributes"=><actionController::Parameters {"image"=>#
<actionDispatch::Http::UploadedFile:0x00007f80f5209680 @tempfile=#
<Tempfile:/tmp/RackMultipart20200407-10555-iewcks.png>,@headers="Content-Disposition: form-data;
name=\"blog_form[photos_attributes][image]\"; filename=\"p8-
1.png\"\r\nContent-Type: image/png\r\n">} permitted: true>,"user_id"=>2}
permitted: true>
我想如何发送一个user_id,非常感谢Fernand,Amit Patel, 我在视图字段中使用了hidden_field而不是合并方法