3

Rails プロジェクトで Valums アップローダを動作させようとしていますが、非常に困難です。

私は現在、標準モデルとビューを使用して、ペーパークリップで非常に簡単なアップロードプロセスを行っています... モデル

class User
  include Mongoid::Document
  include Mongoid::Paperclip

  has_mongoid_attached_file :image

コントローラ

  def avatar
    @user = current_user
    respond_to do |format|
      format.html
    end
  end
  #working on the updateimage method
    def update
      file = params[:qqfile].is_a?(ActionDispatch::Http::UploadedFile) ? params[:qqfile] : params[:file]
        @user = current_user
        if @user.update_attributes(params[:user])
            render :text => '{"success": true}', :content_type => "application/json"
       else
            render :text => @user.errors.to_json, :content_type => "application/json"
       end
     end

意見

= form_for(@user, :as => @user, :url => '/updateimage', :html => { :method => :post, :multipart => true }) do |f|
    #file-uploader
    =@user.firstname
    %img{:src => current_user.image}
    = f.file_field :image
    = f.submit

すっごく...これはすべて機能しますが、Valums jQueryを使用しようとすると:

  $('#file-uploader').fineUploader({
    debug: true,
    autoSubmit: true,
    allowedExtensions: ['jpg', 'jpeg', 'png', 'gif'],
    sizeLimit: 1048576, // max size: 1MB
    minSizeLimit: 0, // min size
    multiple: false,
    request: {
        endpoint: '/updateimage',
        paramsInBody: true
        }
    });

私はこれを得る:

undefined method `update_attributes' for nil:NilClass

私はこれを機能させたいと思っていますが、私は一般的にプログラミングに少し慣れていないので、私にとってはまだかなり抽象的なことです. 追加のログ情報を提供させていただきます。その場所を教えてください。

ルート

             admin_index GET    /admin(.:format)                       admin#index
                         POST   /admin(.:format)                       admin#create
               new_admin GET    /admin/new(.:format)                   admin#new
              edit_admin GET    /admin/:id/edit(.:format)              admin#edit
                   admin GET    /admin/:id(.:format)                   admin#show
                         PUT    /admin/:id(.:format)                   admin#update
                         DELETE /admin/:id(.:format)                   admin#destroy
                  orders GET    /orders(.:format)                      orders#index
                         POST   /orders(.:format)                      orders#create
               new_order GET    /orders/new(.:format)                  orders#new
              edit_order GET    /orders/:id/edit(.:format)             orders#edit
                   order GET    /orders/:id(.:format)                  orders#show
                         PUT    /orders/:id(.:format)                  orders#update
                         DELETE /orders/:id(.:format)                  orders#destroy
                 entries GET    /entries(.:format)                     entries#index
                         POST   /entries(.:format)                     entries#create
               new_entry GET    /entries/new(.:format)                 entries#new
              edit_entry GET    /entries/:id/edit(.:format)            entries#edit
                   entry GET    /entries/:id(.:format)                 entries#show
                         PUT    /entries/:id(.:format)                 entries#update
                         DELETE /entries/:id(.:format)                 entries#destroy
              home_index GET    /home(.:format)                        home#index
                         POST   /home(.:format)                        home#create
                new_home GET    /home/new(.:format)                    home#new
               edit_home GET    /home/:id/edit(.:format)               home#edit
                    home GET    /home/:id(.:format)                    home#show
                         PUT    /home/:id(.:format)                    home#update
                         DELETE /home/:id(.:format)                    home#destroy
                  avatar        /avatar(.:format)                      home#avatar
             updateimage POST   /updateimage(.:format)                 home#update
                    root        /                                      home#home
                    root        /                                      home#index
        new_user_session GET    /users/sign_in(.:format)               devise/sessions#new
            user_session POST   /users/sign_in(.:format)               devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)              devise/sessions#destroy
 user_omniauth_authorize        /users/auth/:provider(.:format)        users/omniauth_callbacks#passthru {:provider=>/facebook/}
  user_omniauth_callback        /users/auth/:action/callback(.:format) users/omniauth_callbacks#(?-mix:facebook)
           user_password POST   /users/password(.:format)              devise/passwords#create
       new_user_password GET    /users/password/new(.:format)          devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format)         devise/passwords#edit
                         PUT    /users/password(.:format)              devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)                users/registrations#cancel
       user_registration POST   /users(.:format)                       users/registrations#create
   new_user_registration GET    /users/sign_up(.:format)               users/registrations#new
  edit_user_registration GET    /users/edit(.:format)                  users/registrations#edit
                         PUT    /users(.:format)                       users/registrations#update
                         DELETE /users(.:format)                       users/registrations#destroy
       user_confirmation POST   /users/confirmation(.:format)          devise/confirmations#create
   new_user_confirmation GET    /users/confirmation/new(.:format)      devise/confirmations#new
                         GET    /users/confirmation(.:format)          devise/confirmations#show
                    user GET    /users/:id(.:format)                   users#show
4

3 に答える 3

2

更新:users#updateそのままにして、ファイルのアップロード用に別のアクションを作成してみる価値があると思います。

ルートに関しては、FineUploader はPOSTリクエストのみを実行するため、新しいルートを追加する必要があります。これは、エンドポイントPOSTへのリクエストが、必要としないアクションを/usersトリガーするためです。users#create

match '/avatar', :to => 'users#avatar', :via => :post

さらに、サーバー側でファイルのアップロードを処理する必要があります。この wiki ページでは、2 つの方法について説明します。たとえば、rack-raw-uploadgem を使用してコントローラー コードを次のように変更できます。

def update
  # this action does not handle AJAX file upload
  # ...
end

def avatar
  file = params[:qqfile].is_a?(ActionDispatch::Http::UploadedFile) ? params[:qqfile] : params[:file]
  @user = current_user
  if @user.update_attributes({ :image => file })
    render :json => { :success => true }
  else
    render :json => { :success => false }
  end
end

( gemconfig/application.rbを使用する場合)に行が必要であることに注意してください。rack-raw-upload

config.middleware.use 'Rack::RawUpload'

さらに、パラメータparamsInBodyに属する必要があるようです:request

$('#file-uploader').fineUploader({
    request: {
        endpoint: "/avatar",
        paramsInBody: true
    },
    debug: true
})

最後の注意:ユーザー認証を有効にするには、AJAX 要求を行うときに CSRF トークンをヘッダーに含める必要があります。setHeaders関数を編集することで実行できますfineuploader.js—この関数に次の行を追加します。

xhr.setRequestHeader("X-CSRF-Token", $("meta[name='csrf-token']").attr("content"));
于 2013-03-20T09:43:27.857 に答える
1

ルート全体を投稿した場合は、エンドポイント ルートがありません。例えば:

put "/avatar" => "your_controller#update"

ps: クライアント側またはサーバー側 (プットまたはポスト) で http 動詞を適応させます

JSON 出力は次のようになりますupdate(valums project wiki によると):

if @photo.save
  render json: {:success => true, :src => @photo.image.url(:thumb)}
else
  render json: @photo.errors.to_json
end
于 2013-03-19T19:29:58.850 に答える
-1

このエラーは、応答で有効な JSON が返されていないことを意味します。詳細については、プロジェクトのサーバー側の readmeを参照してください。もう 1 つの可能性は、エンドポイント アドレスが正しくないことです。

于 2013-03-06T20:29:43.137 に答える