Вложенный атрибут Rails удаляется при вызове build - PullRequest
0 голосов
/ 08 марта 2012

Я очень новичок в Rails, так что, вероятно, здесь есть простая концепция, которую я просто не понимаю, но вот что происходит.

У меня есть модель User (работает на Devise), и у каждого пользователя есть свой соответствующий атрибут фотографии. Я знаю, что мог бы включить фотографию как часть Пользователя, но на самом деле фотографии являются основным содержимым сайта, поэтому я предпочел, чтобы они были их собственной таблицей. Фотомодель имеет прикрепленный скрепку, которая обрабатывает фактический файл фотографии.

Вот в чем проблема: когда я загружаю фотографию как пользователь, все работает по плану, но по какой-то причине, когда я возвращаюсь на страницу загрузки фотографий, только что загруженная фотография удаляется. Я отследил это до этой строки кода:

@ photo = @ user.build_photo

Если я не вызываю это, форма для загрузки выдает ошибку нулевого класса, потому что @ user.photo не существует, но когда я действительно вызываю это, она удаляет ранее загруженную фотографию, что странно, потому что насколько я знаю, это функция создания, которая изменяет базу данных, а не сборка.

Вот что показывает сервер:

Запущен GET "/ settings" для 127.0.0.1 в 2012-03-08 10:19:21 -0800 Обработка индексом SettingsController # в виде пользовательской нагрузки HTML (0,3 мс) ВЫБРАТЬ users. * ОТ users ГДЕ users. id = 6 ПРЕДЕЛ 1 Фото Нагрузка (0,3 мс) ВЫБРАТЬ photos. * ОТ photos ГДЕ photos. user_id = 6 ПРЕДЕЛ 1 (0,2 мс) НАЧАЛО [скрепка] Планирование вложений для удаления. SQL (0,6 мс) DELETE FROM photos WHERE photos. id = 20 [скрепка] Удаление вложений.

А вот пара моих моделей и контроллеров:

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

1 Ответ

1 голос
/ 09 марта 2012

Как вы обнаружили, вызов @user.build_photo удалит photo для этого user, если он уже существует.Вам просто нужно пропустить выполнение build в этом случае:

@photo = @user.photo || @user.build_photo
...