Я хочу использовать святыню во вложенной форме, но случилось
Недопустимый параметр: :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 , :content ).merge!(user_id: current_user.id , photos_attributes: {:image, :id ,:destroy })
end
Итак, но я не могу решить, в чем причина этой ошибки? Подскажите пожалуйста как решить
Сильные параметры
def blog_form_params
params.require(:blog_form).permit(:title , :content ).merge!(user_id:
current_user.id ,
photos_attributes: [:image, :id ,:destroy ])
end
БлогФорма.рб
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"}
блог.rb
class Blog < ApplicationRecord
belongs_to :user
has_many :photos
validates :title ,presence: true
validates :content ,presence: true
end
фото.рб
class Photo < ApplicationRecord
belongs_to :blog
belongs_to :user
include ImageUploader[:image]
end
загрузчик.rb
class ImageUploader < Shrine
end
храм.рб
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 , :content, photos_attributes:
[:image] ).merge!(user_id: current_user.id)
end
Я мог бы решить эту проблему. Вместо этого я не могу объединить user_id Затем произошло ActiveRecord::RecordNotFound (не удалось найти пользователя без идентификатора):
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"=>"", "content"=>"sample",
"photos_attributes"=><ActionController::Parameters {"image"=>#
<ActionDispatch::Http::UploadedFile:0x00007f9240bc77b0 @tempfile=#
<Tempfile:/tmp/RackMultipart20200406-4102-rc9eo6.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">} 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
Blog_form
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", "content"=>"sample",
"photos_attributes"=><ActionController::Parameters {"image"=>#
<ActionDispatch::Http::UploadedFile:0x00007f80f5209680 @tempfile=#
<Tempfile:/tmp/RackMultipart20200407-10555-iewcks.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">} permitted: true>, "user_id"=>2}
permitted: true>
Каким-то образом я мог отправить user_id, я ценю Фернанда, Амита Пателя, я использовал hidden_field в поле представления вместо метода слияния.
User.find(user_id)
заменитеuser_id
наparams[:user_id]
- person Amit Patel   schedule 06.04.2020User.find(user_id)
написан внутри контроллера, но вы использовали класс построителя форм. поэтому вам следует продолжать использоватьUser.find(user_id)
. Можете ли вы просто поделиться тем, что вы получаете, печатаяblog_form_params
? - person Amit Patel   schedule 07.04.2020