Скрепка не вызывается при загрузке вложения, поэтому вложение не сохраняется. Rails3 uploadify

#ruby-on-rails-3 #paperclip #attachment #uploadify

#ruby-on-rails-3 #скрепка #вложение #uploadify

Вопрос:

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

 started POST "/users/1/uploads" for 127.0.0.1 at 2011-04-23 13:38:11  0100
Processing by UploadsController#create as HTML
Parameters: {"utf8"=>"✓",    "authenticity_token"=>"t2dRIH4FgOPnLRhpDK0x7iIfjB9Xj5rqkJRPCWZvJ14=", "upload"=> {"document"=>#<ActionDispatch::Http::UploadedFile:0x2beeb08 @original_filename="Essay  questions have various requirements.doc", @content_type="application/msword",  @headers="Content-Disposition: form-data; name="upload[document]"; filename="Essay  questions have various requirements.doc"rnContent-Type: application/mswordrn",  @tempfile=#<File:C:/DOCUME~1/Ed/LOCALS~1/Temp/RackMultipart20110423-3980-ycq74p>>},  "commit"=>"Upload", "user_id"=>"1"}
[1m[35mUser Load (0.0ms)[0m  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
[1m[36mUpload Load (0.0ms)[0m  [1mSELECT "uploads".* FROM "uploads" WHERE  ("uploads".uploadable_id = 1 AND "uploads".uploadable_type = 'User')[0m
Rendered uploads/_uploadify.html.erb (15.6ms)
Rendered uploads/_form.html.erb (31.2ms)
Rendered uploads/new.html.erb within layouts/application (46.9ms)
Completed 200 OK in 500ms (Views: 234.4ms | ActiveRecord: 0.0ms)
  

В приложении, где скрепка работает нормально, я получаю этот журнал:

 Started POST "/uploads" for 127.0.0.1 at Mon Apr 25 11:35:50  0100 2011
Processing by UploadsController#create as JSON
Parameters: {"_http_accept"=>"application/javascript", "Filename"=>"angels.txt",    "folder"=>"/users/", "authenticity_token"=>"NVJj3ODIGuoc97wGvjWkez1YoN SUDVtNJ k80XdYXM=", "Upload"=>"Submit Query", "user_id"=>"1", "_uploadify_session"=>"BAh7ByIQX2NzcmZfdG9rZW4iMU5WSmozT0RJR3VvYzk3d0d2aldrZXoxWW9OK1NVRFZ0TkorazgwWGRZWE09Ig9zZXNzaW9uX2lkIiU0ZDEyNzZkNzczNzk1MDdiMmQ4NWZmYTY5MDY4YTU0MQ==--7eb8c0ca249e2566998a0e68322a89d731fdb4ad", "Filedata"=>#<ActionDispatch::Http::UploadedFile:0x4958490 @content_type="application/octet-stream", @original_filename="angels.txt", @tempfile=#<File:C:/DOCUME~1/Ed/LOCALS~1/Temp/RackMultipart20110425-4884-vyvdo8-0>, @headers="Content-Disposition: form-data; name="Filedata"; filename="angels.txt"rnContent-Type: application/octet-streamrn">}
[paperclip] identify -format %wx%h "C:/DOCUME~1/Ed/LOCALS~1 /Temp/stream20110425-4884-15he32x-0.txt[0]" 2>NUL
[paperclip] convert "C:/DOCUME~1/Ed/LOCALS~1/Temp/stream20110425-4884-15he32x-0.txt[0]" -resize "300x300>" "C:/DOCUME~1/Ed/LOCALS~1/Temp/stream20110425-4884-15he32x-020110425-4884-r65fe6-0" 2>NUL
[paperclip] identify -format %wx%h "C:/DOCUME~1/Ed/LOCALS~1/Temp/stream20110425-4884-15he32x-0.txt[0]" 2>NUL
[paperclip] convert "C:/DOCUME~1/Ed/LOCALS~1/Temp/stream20110425-4884-15he32x-0.txt[0]" -resize "100x100>" "C:/DOCUME~1/Ed/LOCALS~1/Temp/stream20110425-4884-15he32x-020110425-4884-1ttxfol-0" 2>NUL
[1m[36mAREL (15.6ms)[0m  [1mINSERT INTO "uploads" ("user_id", "created_at", "photo_file_size", "photo_updated_at", "photo_content_type", "photo_file_name", "updated_at") VALUES (1, '2011-04-25 10:36:10.312500', 867, '2011-04-25 10:35:52.109375', 'text/plain', 'angels.txt', '2011-04-25 10:36:10.312500')[0m
[paperclip] Saving attachments.
[paperclip] saving C:/rails_project1/Uploadify-2/public/system/photos/2/medium/angels.txt
[paperclip] saving C:/rails_project1/Uploadify-2/public/system/photos/2/thumb/angels.txt
[paperclip] saving C:/rails_project1/Uploadify-2/public/system/photos/2/original/angels.txt
Completed 200 OK in 19422ms (Views: 62.5ms | ActiveRecord: 15.6ms)
  

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

 class UploadsController < ApplicationController
  before_filter :find_parent
  before_filter :prepare_input_params
  #respond_to :html, :json, :js

  def index
     @uploads = Upload.all
 #@uploads = @parent.try(:uploads).try(:all)
 @upload = Upload.new
     #respond_with([@parent, @uploads])
  end

  def new
     @upload = @parent.uploads.new
  end

  def create 
     @upload = @parent.uploads.build(params[:upload])   
   if @upload.save
        flash[:notice] = "sucessfully saved upload"     
    respond_to do |format|
        format.html {redirect_to [@parent, :uploads]}
        format.json {render :json => { :result => 'success', :upload =>  polymorphic_url([@parent,:uploads])  } }
      end   
  else
      render :action => 'new'
      end
 end

 def edit
   @upload = Upload.find(params[:id])   
 end

 def show
   "puts @upload.inspect"
     @upload = @parent.uploads.find(params[:id])
     @total_uploads = @parent.uploads.find(:all, :conditions => { :user_id =>  @upload.user.id})
 end

 def update
   @upload = Upload.find(params[:id])
    if @upload.update_attributes(params[:upload])
     flash[:notice] = "Successfully updated document"
     redirect_to @upload
    else
     render :action => 'edit'
    end
 end

 def destroy
   @upload = Upload.find(params[:id])
   @upload.destroy
   redirect_to([@parent, :upload])
 end 

 private 
 def prepare_input_params
   params[:upload][:document] = params[:Filedata] if params[:Filedata]
 end
  

завершение

Вот основной файл с формой partial и битом uploadify:https://gist.github.com/940960. Форма имеет:html => { :multipart => true }.

Спасибо за помощь.

Редактировать:

Похоже, проблема в модели, uploads.rb. Когда я комментирую раздел ниже: все работает, но мне нужно иметь возможность использовать проверки и указывать путь, поскольку я хочу использовать S3. Anyhelp о том, как я могу раскомментировать код без повторения первоначальной ошибки, связанной с тем, что скрепка не сохраняется.

 class Upload < ActiveRecord::Base
 attr_accessible  :document
 belongs_to :uploadable,  :polymorphic => true
 has_attached_file :document, :styles => { :small => "150x150>",:thumb => "100x100>" }
=begin                 
             :url => "/uploads/:id/:style/:basename.:extension",
             :path => ":rails.root/public/:uploads/:id/:style/:basement.:extension"                                  
validates_attachment_presence :document
validates_attachment_size  :document, :less_than => 5.megabytes
validates_attachment_content_type :document, :content_type => ['application/octet-stream','image/jpeg','image/gif', 'image/png', 'image/pdf', 'image/doc', 
                                                             'video/x-m4v', 'video/quicktime','application/x-shockwave-flash', 'audio/mpeg', 'video/mpeg', 'application/pdf','application/msword']

=end
  

end

Update:

I think the main problem seem to be that why attaching a new file, paperclip, somehow starts calling SELECT «uploads».*’from «uploads» instead of calling INSERT INTO ‘uploads’, that is controller#create action shown higher up seems to be calling SELECT, whenever ever i provide :url and :path options to paperclip has_attached_file method. See the log below:

 Processing by UploadsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"Azxzi09R7NU7 jxj lxHFGfs qw7D6b7yRKegRjRQMc=", "upload"=> {"document"=>#<ActionDispatch::Http::UploadedFile:0x2994ff0 @original_filename="al night  verses.txt", @content_type="text/plain", @headers="Content-Disposition: form-data;  name="upload[document]"; filename="al night verses.txt"rnContent-Type:  text/plainrn", @tempfile=#<File:C:/DOCUME~1/Ed/LOCALS~1 /Temp/RackMultipart20110505-3444-1rlpnr>>}, "commit"=>"Upload", "user_id"=>"1"}
[1m[35mUser Load (0.0ms)[0m  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
[paperclip] C:ImageMagick-6.6.3-Q16/identify -format %wx%h "C:/DOCUME~1/Ed/LOCALS~1 /Temp/stream20110505-3444-1cpnf87.txt[0]"
[paperclip] C:ImageMagick-6.6.3-Q16/convert "C:/DOCUME~1/Ed/LOCALS~1 /Temp/stream20110505-3444-1cpnf87.txt[0]" -resize "150x150>" "C:/DOCUME~1/Ed/LOCALS~1 /Temp/stream20110505-3444-1cpnf8720110505-3444-1vnp5jx"
[paperclip] C:ImageMagick-6.6.3-Q16/identify -format %wx%h "C:/DOCUME~1/Ed/LOCALS~1 /Temp/stream20110505-3444-1cpnf87.txt[0]"
[paperclip] C:ImageMagick-6.6.3-Q16/convert "C:/DOCUME~1/Ed/LOCALS~1 /Temp/stream20110505-3444-1cpnf87.txt[0]" -resize "100x100>" "C:/DOCUME~1/Ed/LOCALS~1 /Temp/stream20110505-3444-1cpnf8720110505-3444-1vyk9i"
 [1m[36mUpload Load (0.0ms)[0m  [1mSELECT "uploads".* FROM "uploads" WHERE  ("uploads".uploadable_id = 1 AND "uploads".uploadable_type = 'User')[0m
Rendered uploads/_uploadify.html.erb (15.6ms)
Rendered uploads/_form.html.erb (31.2ms)
Rendered uploads/new.html.erb within layouts/application (62.5ms)
  

Основываясь на запросе @CharlieMezak, вот просмотры / загрузки /_form.html.erb:

 <%= debug @parent %>
<%= render :partial => "uploads/uploadify" %>
</br>
<%= form_for [parent, upload], :html => { :multipart => true } do |f|  %>
<div class="field">
<%= f.label :document %><br />
<%= f.file_field :document %>
</div>

<div class="actions">
<%= f.submit "Upload"%>
</div>
  

просмотры/загрузки/new.html.erb:

 <%= render 'form', :parent => @parent, :upload => @upload %>
  

просмотры/пользователи/index.html.erb:

 <%= render "uploads/form", :parent => user, :upload => user.uploads.new %>
  

Дополнительные обновления :

Как я уже упоминал, когда я комментирую параметры : styles, : :url и:path из paperclips **’has_many_attachment:document’, вызывается оператор INSERT, и хотя он сохраняет файл, вместо отображения прикрепленного файла он в конечном итоге отображает несколько параметров, таких как токены подлинности и т.д. На веб-сайте, Как показано ниже:

 attributes:
id: 1
email: xyz@yahoo.com
encrypted_password: $2a$10$HiksbkRXDtcXiJyUIRj
password_salt: $2a$10$HiksbkRXD
reset_password_token: !!null 
remember_token: !!null 
remember_created_at: !!null 
sign_in_count: 3
current_sign_in_at: '2011-04-25 18:57:27.078125'
last_sign_in_at: '2011-04-25 09:25:31.406250'
current_sign_in_ip: 127.0.0.1
last_sign_in_ip: 127.0.0.1
created_at: '2011-04-09 17:46:15.546875'
updated_at: '2011-04-25 18:57:27.078125'
changed_attributes: {}
previously_changed: {}
attributes_cache: {}
marked_for_destruction: false
destroyed: false
readonly: false
new_record: false
  

Комментарии:

1. Можем ли мы на самом деле увидеть код вашей формы?

2. Не существует SELECT инструкции для сбора информации о пользователе для проверки токена аутентификации?

3. @CharlieMezak, спасибо, что назначили вознаграждение за этот вопрос. Часть формы и другие файлы просмотра прикреплены.

4. @Joseph. Спасибо, но я не думаю, что инструкция SELECT предназначена для захвата пользователя, потому что, когда я закомментирую параметры : url и :path из paperclips **’has_many_attachment:document’ , вызывается инструкция «ВСТАВЛЯТЬ», и хотя она сохраняет файл, в конечном итоге на веб-сайте отображаются мой пароль, токены подлинности и т.д.

5. Ах, я понимаю, ну, мы определенно не хотим, чтобы это произошло

Ответ №1:

Вы не забыли добавить :multipart => true в тег формы в вашем представлении?

Комментарии:

1. хах, я собирался предложить то же самое. это доставало меня не один раз!

Ответ №2:

Попробуйте добавить :document_file_name к вызову attr_accessible.

Комментарии:

1. спасибо, но после добавления:document_file_name к вызову attr_accessible он по-прежнему не будет работать должным образом, если я не закомментирую раздел ‘has_attached_file:document’ и проверки.

2. Ну что ж, просто идея. Раньше у меня была сложная ошибка, когда у меня не было:document как attr_accessible.

Ответ №3:

Одна вещь, которую я заметил, это опечатка в строке 17 uploadify в вашей сути. У вас есть dat.upload, вероятно, должен быть data.upload?

Кроме того, вы пробовали раскомментировать проверки по одной за раз? Дайте мне знать, что произойдет. У меня была изрядная доля сражений против скрепки.

Комментарии:

1. спасибо за предложения. Я исправил написание и проверил проверки, которые теперь кажутся нормальными, но вложения все равно не будут работать, если ‘has_attached_file:document’ имеет какие-либо параметры. Дополнительно я вижу две ошибки маршрутизации. Во-первых, когда скрепка вызывает ‘SELECT’ вместо ‘INSERT’, а во-вторых, когда я вызываю localhost: 3000/users / 1 /uploads, он вместо этого вызывает uploads/index.html.erb . Еще раз спасибо

Ответ №4:

Я делаю точно такие же вещи, как и вы, но использую драгоценный камень aws-s3, который помогает мне загружать файлы на S3 через paperclip. Это то, что есть в моей модели:

 has_attached_file :image,
                :storage => :s3,
                :s3_credentials => "#{Rails.root.to_s}/config/s3.yml",
                :bucket => "your_s3_bucket_name",
                :path => ":attachment/:id/:style/:filename"
  

И у меня есть это в моем gemfile:

 gem "paperclip", "~> 2.3"

gem "aws-s3"
  

И в моей таблице групп:

 t.string   "image_file_name"
t.string   "image_content_type"
t.integer  "image_file_size"
t.datetime "image_updated_at"
  

Комментарии:

1. Спасибо. Вы предлагаете использовать has_attached_file:document’. Я запустил ** rails generate paperclip upload document вместо rails generate paperclip upload image . Как вы думаете, document — это зарезервированное слово в rails. Еще раз спасибо.