يتم حذف السمة المتداخلة لـ Rails عندما أقوم باستدعاء build.log
-
09-12-2019 - |
سؤال
أنا جديد جدًا في استخدام Rails، لذا من المحتمل أن يكون هناك مفهوم بسيط هنا لم أفهمه، ولكن إليك ما يحدث.
لدي نموذج مستخدم (مدعوم من Devise)، ولكل مستخدم سمة الصورة الخاصة به.أعلم أنه كان بإمكاني تضمين الصورة كجزء من المستخدم، ولكن الصور هي في الواقع المحتوى الأساسي للموقع، لذلك فضلت أن تكون جدولًا خاصًا بهم.يحتوي نموذج الصورة على مشبك ورق مرفق يتعامل مع ملف الصورة الفعلي.
ها هي القضية:كل شيء يعمل وفقًا للخطة عندما أقوم بتحميل صورة كمستخدم، ولكن لسبب ما، عندما أعود إلى صفحة تحميل الصورة، يتم حذف الصورة التي قمت بتحميلها للتو.لقد تتبعته وصولاً إلى هذا السطر من التعليمات البرمجية:
@photo = @user.build_photo
إذا لم أتصل بذلك، فإن نموذج التحميل يعرض خطأ فئة صفر لأن @user.photo غير موجود، ولكن عندما أقوم باستدعاءه، فإنه يحذف الصورة التي تم تحميلها مسبقًا، وهو أمر غريب، لأنه بقدر ما أعلم أن وظيفة الإنشاء هي التي تغير قاعدة البيانات، وليس البناء.
إليك ما يظهره الخادم:
بدأت الحصول على "/الإعدادات" لـ 127.0.0.1 في 2012-03-08 10:19:21 -0800 معالجة عن طريق الإعدادات
users
.* منusers
أينusers
.id
= 6 حد 1 تحميل الصورة (0.3 مللي ثانية) حددphotos
.* منphotos
أينphotos
.user_id
= 6 LIMIT 1 (0.2 مللي ثانية) BEGIN [مشبك ورق] جدولة المرفقات للحذف.SQL (0.6 مللي ثانية) حذف منphotos
أينphotos
.id
= 20 [paperclip] حذف المرفقات.
وإليك اثنين من النماذج ووحدات التحكم الخاصة بي:
class SettingsController < ApplicationController
def index
@user = current_user
@photo = @user.build_photo
end
end
<h1>Settings Page</h2>
<%= image_tag @user.photo.the_photo.url(:medium) %>
<%= form_for [@user, @photo], :html => { :multipart => true } do |f| %>
<%= f.file_field :the_photo %>
<%= f.submit %>
<% end %>
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
# Setup accessible (or protected) attributes for your model
attr_accessible :email, :password, :password_confirmation, :remember_me, :name, :photo_attribute
has_one :photo, :dependent => :destroy
accepts_nested_attributes_for :photo
end
class PhotosController < ApplicationController
def create
@user = current_user
@photo = @user.create_photo(params[:photo])
redirect_to root_path
end
def update
@user = current_user
@photo = @user.photo
if @photo.update_attributes(params[:photo])
redirect_to settings_path
else
redirect_to settings_path
end
end
def destroy
end
end
المحلول
كما اكتشفت، الاتصال @user.build_photo
سيتم إزالة أ photo
من أجل هذا user
إذا كان واحدا موجودا بالفعل.تحتاج فقط إلى تخطي القيام بذلك build
في هذه الحالة:
@photo = @user.photo || @user.build_photo