2015-09-10 3 views
1

Я использую Refile для прикрепления изображений. Учитывая следующие модели:Вложенные атрибуты загруженного изображения не сохраняются

class User < ActiveRecord::Base 
    has_many :avatars, dependent: :destroy                                
    accepts_attachments_for :avatars, attachment: :file, append: true 
    accepts_nested_attributes_for :avatars, :allow_destroy => true 
end 

class Avatar < ActiveRecord::Base 
    belongs_to :user 
    attachment :file 
end 

Я пытался сохранить изображение метаданных, в частности, имя файла, размер и тип содержимого в базе данных. Чтобы сделать это, я добавил необходимые столбцы Аватаром таблицы:

class AddMetadataToAvatars < ActiveRecord::Migration 
    def change 
    add_column :avatars, :avatar_filename, :string 
    add_column :avatars, :avatar_size, :integer 
    add_column :avatars, :avatar_content_type, :string 
    end 
end 

Метаданные извлекаются, но не включены в базу данных, так как только: идентификатор и _: уничтожить ссылаются:

Started PATCH "https://stackoverflow.com/users/2" for ::1 at 2015-09-08 23:18:16 +0100 
Processing by UsersController#update as HTML 
Parameters: {"utf8"=>"✓", "authenticity_token"=>"Nd1e6floj/2E9LIGYQ5k/ySHaoaih7qdfXgeyOPfNvjazg3wwv32hGGRFdaPt2QF+qgPZ2LkKIIOOYhBkkxV+w==", "user"=>{"organization"=>"", "description"=>"Lorem ipsum dolor sit amet, consectetur adipiscing elit.", "avatars_files"=>[#<ActionDispatch::Http::UploadedFile:0x007ffdbb7a7630 @tempfile=#<Tempfile:/var/folders/s_/dyxd936x3y3d0r_vj__rc3fr0000gn/T/RackMultipart20150908-1276-hshsql.jpg>, @original_filename="saner.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"user[avatars_files][]\"; filename=\"saner.jpg\"\r\nContent-Type: image/jpeg\r\n">], "avatars_attributes"=>{"0"=>{"_destroy"=>"1", "id"=>"11"}}}, "commit"=>"Update", "id"=>"2"} 
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 2]] 
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 2]] 
(0.1ms) BEGIN 
Avatar Load (0.4ms) SELECT "avatars".* FROM "avatars" WHERE "avatars"."user_id" = $1 AND "avatars"."id" = 11 [["user_id", 2]] 
SQL (0.7ms) UPDATE "users" SET "description" = $1, "organization" = $2, "updated_at" = $3 WHERE "users"."id" = $4 [["description", "Lorem ipsum dolor sit amet, consectetur adipiscing elit."], ["organization", ""], ["updated_at", "2015-09-08 22:18:16.467827"], ["id", 2]] 
SQL (0.2ms) DELETE FROM "avatars" WHERE "avatars"."id" = $1 [["id", 11]] 
SQL (0.4ms) INSERT INTO "avatars" ("file_id", "user_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id" [["file_id", "73a5b77ea364a091c9e88743c0698c6891ea32baf3005e59c2db18d60398"], ["user_id", 2], ["created_at", "2015-09-08 22:18:16.473533"], ["updated_at", "2015-09-08 22:18:16.473533"]] 
(0.5ms) COMMIT 
Redirected to http://localhost:3000/users/2 
Completed 302 Found in 20ms (ActiveRecord: 2.7ms) 

Это происходит, даже если я белый список атрибутов в контроллере:

def user_params 
    params.require(:user).permit(:description, :organization, avatars_files: [], avatars_attributes: [:id, :avatar_filename, :avatar_size, :avatar_content_type, :_destroy]) 
end 

прикрепление изображений и работа удаления штраф. Единственная проблема заключается в том, что метаданные не добавляются.

У меня, вероятно, отсутствует что-то простое здесь. Есть идеи?

ответ

0

Учитывая refile documentation, вам необходимо добавить следующие столбцы в avatars таблицы:

file_filename 
file_size 
file_content_type 

также обновление моделей следующим образом:

class User < ActiveRecord::Base 
    has_many :avatars, dependent: :destroy                                
    accepts_attachments_for :avatars, attachment: :file, append: true 
    # you don't need accepts_nested_attributes_for 
    # accepts_attachments_for wires up the necessary accepts_nested_attributes_for 
    # accepts_nested_attributes_for :avatars, :allow_destroy => true 
end 

class Avatar < ActiveRecord::Base 
    belongs_to :user 
    attachment :file 
end 

и обновлять белый список пользовательского Params следующие :

def user_params 
    # you dont need to whitelist avatars_attributes 
    # avatars_files is enough to be whitelisted 
    params.require(:user).permit(:description, :organization, avatars_files: []) 
end 

Надеюсь, что это поможет.

Смежные вопросы