يتم حذف السمة المتداخلة لـ Rails عندما أقوم باستدعاء build.log

StackOverflow https://stackoverflow.com//questions/9622950

سؤال

أنا جديد جدًا في استخدام 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top