Недопустимый параметр:: photos_attributes - PullRequest
0 голосов
/ 06 апреля 2020

Я хочу использовать храм святыни во вложенной форме, но случилось

Неразрешенный параметр:: 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

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 , :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 'для #

nil

Я изменил 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>

Somwhow я мог отправить user_id, я ценю Фернана, Амит Патель, я использовал hidden_ поле представления вместо поля слияния

1 Ответ

0 голосов
/ 06 апреля 2020

это потому, что вы помещаете photos_attributes в часть объединения вместо атрибута blog_form

, как насчет этого:

params.require(:blog_form).permit(:title , :content, :photos_attributes =>[:image, :id, :destroy] )

, затем обновите blogs_controller:

def create
  @blog_form = BlogForm.new(blog_form_params)
  @blog_form.user_id=params[:user_id]
  ...

затем в BlogForm.rb:

def blog_builder
  @user = User.find(user_id)
  ...
...