как хранить изображения в файловой системе Ruby on Rails - PullRequest
0 голосов
/ 23 марта 2011

Две модели.

Активы - используются для загрузки файлов со скрепкой.

class AddAttachmentsPhotoToAsset < ActiveRecord::Migration
  def self.up
    add_column :assets, :photo_file_name, :string
    add_column :assets, :photo_content_type, :string
    add_column :assets, :photo_file_size, :integer
    add_column :assets, :photo_updated_at, :datetime
  end

Доски - блог

class CreateBoards < ActiveRecord::Migration
  def self.up
    create_table :boards, :options => "AUTO_INCREMENT = 1000" do |t|
        t.column :deliver_on,    :datetime
        t.column :time_zone,     :string
      t.column :header_text,   :text
      t.column :name,          :string
      t.column :age,           :int, :default => "0"
      t.column :template_id,   :int, :default => "1", :null => false
      t.column :photo, :string
      t.timestamps
    end
  end

new.html.erb

В нижней части этой формы есть работа с ajax iframe. Пользователь может загрузить изображение и просмотреть его в форме перед отправкой. Поэтому не существует доски, которую можно сохранить для загрузки изображения. Поэтому мне пришлось создать объект актива.

<% form_tag(action, :id => "form")  do %>
<%=image_tag board_image, :width => 140, :height => 166, :id => 'user_image' %><%= hidden_field :board, :photo, :id => 'image_name'%>

<%= error_messages_for :user,:board,  :header_message => "" %>
<%= label_tag  :name, "Friend's Name:", :class => "large"%>
<%= text_field :board, "name", :class => "large", :style => Board::NAME_WIDTH %>    
.
.
.
<%=submit_tag "#{button_text}", :id => "board_submit"%> 
<% end %>

Это должно быть за пределами другой формы, иначе оно не будет работать, поэтому у меня это здесь внизу после тега <% end%> другой формы.

Загрузка файла изображения в стиле iframe ajax.

<% remote_form_for(:asset, :url => { :controller => "asset", :action => "upload", :id => @tmp_id }, :html => { :method => :post, :id => 'uploadForm', :multipart => true }) do |f| %>
<%= f.file_field :photo, :class => 'file' %>
<% end %>

upload.js

//ajax file upload
        $(function() { 
        $("#uploadForm input").change(function(){
         $("#uploadForm").ajaxSubmit({
          beforeSubmit: function(a,f,o) {
           o.dataType = "json";
          },
          complete: function(XMLHttpRequest, textStatus) {
          $('#user_image').attr('src', XMLHttpRequest.responseText +'?'+ new Date().getTime());
          $('#image_name').attr('value', XMLHttpRequest.responseText);
           return; false;
          },
         });
        });
        });

In assets_controller.rb

 def upload
      if params_posted?(:asset) #check that the form was submitted with a post action
        @asset = Asset.new(params[:asset]) #create  new paperclip object to upload item
        @asset.save   #upload the photo
        render :text => @asset.photo.url #put the name on the form.
      end 
  end

In board_controller

def create
...
@board.new(params[:board])
...


end

Файл загружается с объектом assets . Файл хранится в таблице assets в базе данных URL-адрес фотографии хранится в скрытом поле формы. Доска создана, а URL фото хранится в таблице Доски.

Таким образом, я сохранил данные фотографии в двух таблицах, что кажется неправильным.

Я новичок, зеленый, как всегда.

Лучше ли хранить asset.id экземпляра Asset, используемого для загрузки изображений, вместо URL-адреса изображения в таблицу Board?

Для ясности:

Должен ли я иметь поле в моей таблице советов

t.column asset_id

а затем каким-то образом получить доступ к данным фотографии активов?

Заранее благодарю immensley за ваш опыт.

Ответы [ 2 ]

0 голосов
/ 24 марта 2011

Я нашел ответ здесь

Когда я передаю информацию из объекта @asset в объект Board.

В Board.rb я делаю, как предложено в коррозии, и добавляю скрепку

 has_attached_file :photo  #I can also add styles, where I want to save the photo etc

Так что я не думаю, что мне нужно фото с досок из params. Я создаю его по URL-адресу @ asset.photo.url.

   @board.photo = @asset.photo

Когда я делаю @ board.save, он запускает все методы скрепки, как если бы файл был загружен, потому что они запускаются при сохранении элементов. Поэтому они будут скопированы из временного хранилища туда, где я хочу, чтобы они находились, когда у меня будет доска. Затем я должен удалить временные каталоги и сборку в таблице ресурсов, так как она сделала свою работу.

Обновление: теперь все работает отлично. Я исправил код выше.

важное замечание !!!!!

вы должны сделать следующее после сохранения новой модели, иначе значения URL и пути будут неправильными.

model.photo.reprocess!

(замените модель на вашу модель. В моем случае это было @ board.photo.reprocess!)

Это мой окончательный ответ

0 голосов
/ 23 марта 2011

На самом деле, почему бы просто не подключить насадки к вашей модели платы вместо двух отдельных моделей для них? Вы используете активы для своих других моделей? Если нет, то лучше просто добавить has_attachment в модель board.rb

...