1

Rails 3.2.8で100%ajaxのアプリケーションを書いています

従業員の写真を従業員管理モジュールにアップロードしようとするまで、すべてが順調に進んでいました。

これは私のコードの一部です:

コントローラーで:

class EmpleadosController < ApplicationController
  respond_to :js
  before_filter :require_user

  def index
    @empleados = Empleado.paginate( page: params[ :page ],
                                    joins: [:user,:contacto],
                                    select: 'empleados.id as id, empleados.user_id, empleados.contratado_el, empleados.despedido_el, empleados.nss, empleados.sueldo_base_semanal, empleados.comentarios, empleados.foto_file_name, empleados.foto_content_type, empleados.foto_file_size, empleados.foto_updated_at, users.username as username, contactos.salutacion_id as salutacion_id, contactos.id as contacto_id, contactos.nombres as nombres, contactos.apellidos as apellidos'
                                  ).sorted( params[ :sort ] )
  end


  def new
    @empleado = Empleado.new
  end

  def create
    @empleado = Empleado.new(params[:empleado])
    @empleado.sueldo_base_semanal = params[:empleado][:sueldo_base_semanal].gsub(',','').gsub('$','').to_f
    if @empleado.save
      redirect_to empleados_path
    else
      render action: 'new'
    end
  end
...

ビューについて(私はHAMLを使用しています):

= form_for( @empleado, remote: true, html: {multipart: true} ) do |f|
  = show_me_the_errors @empleado

  %table.captura
    %tr
      %td.etiqueta
        = f.label :user_id
      %td.campo
        = f.select  :user_id,
                    User.usuarios_no_asignados,
                    { include_blank: true },
                    { tabindex: 1 }
        = image_tag 'nuevo_24.png',
                    style: 'vertical-align: bottom;',
                    id: 'empleado_nuevo_usuario'
... ( 5 more text fields ) ...

    %tr
      %td.etiqueta
        = f.label :foto
      %td.campo
        = f.file_field :foto,
                       accept: 'image/png,image/gif,image/jpeg'

問題は、アップロードするファイルが選択されていない間、すべてが正常に機能し、コマンドがとrespond_to :jsの間のすべての対話で正常に機能することです。createindexnew

しかし、画像を選択すると、 と の後のすべてのやり取りcreateが を完全に無視するようにindexなりnewます。HTMLrespond_to :jsform forremote: true

すべてが正常に機能すると、URL は localhost:3000 になり、変更されることはありませんが、アップロードする画像を選択すると、その後の URLcreteは localhost:3000/empleadosになります。

誰でもこれについて手がかりを持っていますか? 私は過去3日間、これを解決しようとして失敗しました。

あらかじめご了承ください。

4

1 に答える 1

3

OK、問題を見つけようとして数日後、回避策に取り組み始めました。だからこれはそれです:

1)自動インクリメントなしで ID フィールドを設定し、通常のフィールド名を使用して、一時ストレージ用の DB テーブルを作成しました。

mysql> describe imagens;
+---------------------+--------------+------+-----+---------+-------+
| Field               | Type         | Null | Key | Default | Extra |
+---------------------+--------------+------+-----+---------+-------+
| id                  | int(11)      | NO   | PRI | NULL    |       |
| imagen_file_name    | varchar(500) | YES  |     | NULL    |       |
| imagen_content_type | varchar(500) | YES  |     | NULL    |       |
| imagen_file_size    | int(11)      | YES  |     | NULL    |       |
| imagen_updated_at   | datetime     | YES  |     | NULL    |       |
| created_at          | datetime     | NO   |     | NULL    |       |
| updated_at          | datetime     | NO   |     | NULL    |       |
| lock_version        | int(11)      | NO   |     | 0       |       |
+---------------------+--------------+------+-----+---------+-------+
8 rows in set (0.00 sec)

2)ビュー ( _form.html.haml) で:

-# this variable will be used as primary key for identifying the image to upload in the database
- ale = Time.now.to_i 

3)ビュー ( _form.html.haml):

file_fieldタグを切り離しました

-# FORM for general data input
= form_for( @empleado, remote: true ) do |f|
  ...

ale次に、そのフォーム内に、変数と非常に小さな隠しファイルを追加しますiframe

-# I use it in order to find out for wich record to search at the temporary DBTable 
= hidden_field_tag :ale, ale
-# this IFRAME will be used to catch the error message returned by rails when uploading the image, it will be invisible
%iframe{src: '#', frameborder:0, height: 0, width: 0, id: 'nulo', name: 'nulo'}

独自のタグにカプセル化されていますが、ボタンやボタンform_forはありません。submitcommit

= form_for( @imagen, remote: true, html: {multipart: true, target: 'nulo'} ) do |f|
  -# used to set the primary key to this value
  = hidden_field_tag :ale, ale
  = f.file_field :imagen, {style: 'vertical-align: middle;'}

次に、ユーザーが画像を選択したときに画像をアップロードするための小さな JavaScript で、イベント トリガーによって送信されます。

:javascript
  $('#imagen_imagen').change(function(){
    $('#new_imagen').submit();
  });

4)これはimagenのモデルの内容です(models/imagen.rb):

class Imagen < ActiveRecord::Base
  attr_accessible :imagen
  has_attached_file :imagen,
                    styles: { t100: '100x100>', t300: '300x300X', t600: '600x600' },
                    convert_options: { all: '-strip' },
                    path: ":rails_root/public/system/:class/:attachment/:id/:style/:filename",
                    url: "/system/:class/:attachment/:id/:style/:filename",
                    hash_secret: 'topsecret'
  validates_attachment_size :imagen,
                            less_than: 250.kilobytes,
                            message: (I18n.t :mensajes)[:paperclip][:grande]
end

5)これは controllers/imagens_controller.rb のコードです:

class ImagensController < ApplicationController

  respond_to :js
  # by the way, this sline is from authlogic, a great gem to control the access to your site
  before_filter :require_user

  def create
    @imagen = Imagen.new(params[:imagen])
    @imagen.id = params[:ale]
    @imagen.save
    render text: ''
  end

end

6)現在、controller/empleados_controller.rb のコードは次のとおりです。

def create
  @empleado = Empleado.new(params[:empleado])
  if @empleado.save
    imagen = Imagen.find(params[:ale].to_i)
    if imagen
      @empleado.foto = imagen.imagen
      @empleado.save
      imagen.destroy
    end
    redirect_to empleados_path
  else
    @imagen = Imagen.new
    render action: 'new'
  end
end

7)用語集:

imagen = 画像

empleado = 従業員

empleados = スタッフ

ale = アレトリオの短い名前、つまり、ランダム

foto = 画像 o 写真撮影

8)結論:

できます !!!

9)やること:

欠点は、画像をアップロードした後、データベースに保存され、フォームをキャンセルしたりページを変更したりできることです。これにより、レコードと画像が生きたままになります。

最初に、一時画像を保持するテーブルからすべてのレコードを破棄する管理モジュールにリンクを作成します。Imagen.all.each{|x| x.destroy }

後で、午前 2 時にそのコードを実行するスクリプトを作成します。

于 2012-10-19T14:14:40.920 に答える