form_remote_for с помощью помещенного в другое действие

мне нужно сделать запрос "поместить" в действие "/users/upload_image".

Следующий код:

<% form_remote_for @user, :url => "/users/upload_image?id=#{@user.id}", :method => :put, :html => { :multipart => true } do |upload_form| %>
    <%= upload_form.file_field :avatar %>
<% end %>

Производит следующий HTML:

<form action="/users/1234567" method="post" onsubmit="$.ajax({data:$.param($(this).serializeArray()) + '&amp;authenticity_token=' + encodeURIComponent('HMkaYvfHyyYR1jGpVPkyLPfkPacqvTvtHjgDowzwzuY='), dataType:'script', type:'post', url:'/users/1234567'}); return false;">

Когда я устанавливаю :method => :put в параметре :html, он будет установлен только в HTML, а не в коде JavaScript.

  1. Мне нужно "поместить" внутри тега формы и JavaScript
  2. Мне нужно действие, например "/users/upload_image"

Как это сделать ?

Спасибо


person AntonAL    schedule 16.03.2011    source источник


Ответы (1)


Если вы посмотрите ниже тега <form>, вы увидите:

<input name="_method" type="hidden" value="put" />

Это потому, что HTTP не поддерживает методы PUT и DELETE. Он поддерживает только GET и POST, поэтому Rails таким образом имитирует метод PUT.

UPD

О загрузке файла ajax: загрузка файла Ruby on Rails AJAX

чтобы добавить /users/:id/upload_image путь, вы должны отредактировать свои маршруты и контроллер:

# routes to get /users/:id/upload_image
map.resources :user, :member => {:upload_image => :put}

# users_controller
def upload_image
  @user = User.find(params[:id])
  ...
end

Теперь вы можете использовать upload_image_user_path(@user), который сгенерирует для вас /users/@user.id/upload_image URL

ОБНОВЛЕНИЕ 2

Если вы хотите получить /users/upload_image?user_id=XXX

# config/routes.rb
map.resources :user, :collection => {:upload_image => :put}

# app/controllers/users_controller.rb
def upload_image
  @user = User.find(params[:user_id])
  ...
end
person fl00r    schedule 16.03.2011
comment
да. Понимаю. Спасибо. Как настроить :url? - person AntonAL; 16.03.2011
comment
Спасибо. У меня уже есть рабочий код загрузки. Но этот запрос был обработан в методе /users/update. Поскольку это разные сценарии, мне нужно иметь отдельное действие, называемое /users/upload_image. Единственное, что мне нужно сейчас, это изменить действие в form_remote_for. Установка другого :url не дает никакого эффекта. - person AntonAL; 16.03.2011
comment
новое обновление. Но, на самом деле, я не понимал всей картины. - person fl00r; 16.03.2011
comment
Мне просто нужно реализовать загрузку аватара в отдельном действии контроллера. Спасибо ! я работаю! - person AntonAL; 16.03.2011