Сохранить переменную JavaScript в модели Rails

Я использую API FileStack и гем сборщика файлов (https://github.com/Ink/filepicker-rails< /а>). Я выполняю шаги, описанные в документе в разделе «Доступ к файлу FilePicker с помощью OnChange». Я пытаюсь получить атрибут ответа браузера JSON, имя файла, передать его моему контроллеру Rails через маршрут и сохранить его как :name в моей модели вложения.

Вложение/Новое представление

<%= filepicker_js_include_tag %>

<%= simple_form_for(@attachment) do |f| %>

<%= f.filepicker_field :title, multiple: 'true', onchange: 'onUpload(event)' %>
<%= f.submit %>

<% end %>

<script>
  function onUpload(event) {
  var name = event.fpfile.filename;
  jQuery.ajax({
   data: { "attachment[name]": name, "attachment[title]": url },
   type: 'post',
   url: "/attachments"
  });
 }
</script>

Маршрут

post 'attachments/' => 'attachment#create'

Контроллер вложений

    def create

      @attachment = current_user.attachments.build(attachment_params)

      if @attachment.save
        redirect_to attachments_path
      else
        render root_path
      end
end
...

private

    def attachment_params
        params.require(:attachment).permit(:title, :user_id, :name)
    end

Я просмотрел соответствующие сообщения SO, и именно так я пришел к этой реализации. Однако, когда я просматриваю свою модель вложения в консоли рельсов, имя равно нулю. Мои данные не передаются должным образом. Я не уверен, пропускаю ли я шаг или неправильно маршрутизирую. Любые советы будут высоко ценится.


person user3318660    schedule 17.05.2016    source источник
comment
вы пробовали так в ajax data: { "attachment[name]" : name }?   -  person 7urkm3n    schedule 17.05.2016
comment
Пожалуйста, смотрите мой обновленный код выше. Я добавил data: { "attachment[name]" : name }, и больше не получаю ошибку параметров имени. Но похоже, что два запроса POST происходят, как вы можете видеть в выводе моего терминала, и имя по-прежнему равно нулю. Он перезаписывается?   -  person user3318660    schedule 17.05.2016
comment
Когда я загружаю файл и закрываю сервер (перед тем, как нажать «Отправить»), я получаю `=› #‹Идентификатор вложения: 69, заголовок: nil, created_at: 2016-05-17 05:10:53, updated_at: 2016-05 -17 05:10:53, user_id: 2, name: myFile.doc›`, когда я проверяю консоль. Однако, когда я отправляю, заголовок имеет значение, но имя равно нулю.   -  person user3318660    schedule 17.05.2016


Ответы (2)


Ваш контроллер очень грязный, удалите большинство из них и просто сделайте его простым, как показано ниже. Эта одна строка закроет для вас current_user.id и name.

def create
  @attachment = current_user.attachments.build(attachment_params)
  if @attachment.save
    redirect_to attachments_path
  else
    render root_path
  end
end

Кроме того, тем временем у вас есть разрешение на параметры

params.require(:attachment).permit(:name, :title, :user_id)

Вы должны передавать данные, подобные этим "attachment[name]", но вы передаете их просто "name". Вот причина получения Unpermitted parameter: name. И, как упомянул @anonymousxxx, удалите :name часть из маршрутов!!!

Скрипт

<script>
  function onUpload(event) {
  var name = event.fpfile.filename;
  jQuery.ajax({
   data: { "attachment[name]": name },
   type: 'post',
   url: "/attachments"
  });
 }
</script>
person 7urkm3n    schedule 17.05.2016
comment
Я упомянул об этом выше, но чтобы уточнить, теперь, когда я загружаю файл, имя имеет значение, а заголовок равен нулю. Но когда я нажимаю кнопку отправки, заголовок имеет значение, а имя равно нулю. Сейчас я пытаюсь найти способ избежать этого. Не уверен, почему это происходит. - person user3318660; 17.05.2016
comment
@user3318660 user3318660 удалите f.submit часть из формы, потому что вы уже отправляете ее через ajax с onchange: 'onUpload(event)'. Также убедитесь, что yr var name = event.fpfile.filename; сохраняет имя. 1-й год запрашивает ajax, затем кнопка отправки запрашивает его. - person 7urkm3n; 17.05.2016
comment
Да, я удалил f.submit и добавил это в свой JavaScript. Теперь работает нормально. Спасибо всем за помощь! success: function(data) { $('#simple_form_id').submit(); - person user3318660; 17.05.2016

@attachment = current_user.attachments.build(attachment_params)
@attachment.user_id = current_user.id

Вам не нужно назначать current_user.id, потому что в первой строке вы создаете вложение с current_user

@foo = params[:name]
@attachment.name = @foo

Этот код избыточен, я думаю. Почему вы назначаете params[:name] @foo ? Если у вас есть атрибут :name в разрешении attactment_params, они вам не нужны.

Просто

@attachment = current_user.attachments.build(attachment_params)
if @attacment.save
..
..

Если у вас его нет, вы можете использовать merge таких параметров

@attachment = current_user.attachments.build(attachment_params.merge(name: params[:name]))
@attachment.save
..
..

О, также вы можете объединить метод params, а не объединяться в действии.

def attachment_params
 params.require(:attachment).permit(:user_id).merge(name: params[:name])
end
person rails_id    schedule 17.05.2016
comment
Спасибо за ответ. Я пробовал обе реализации, но я получаю это в своем терминале. Processing by AttachmentsController#create as */* Parameters: {"name"=>"myFile.docx"} User Load (2.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 2]] Completed 400 Bad Request in 53ms (ActiveRecord: 2.0ms) ActionController::ParameterMissing (param is missing or the value is empty: attachment): app/controllers/attachments_controller.rb:44:in 'attachment_params' app/controllers/attachments_controller.rb:12:in 'create' - person user3318660; 17.05.2016
comment
Имя до сих пор не сохраняется. Другие предложения, которые я прочитал, заключаются в том, чтобы другой контроллер справился с этим? Я не получаю ошибку параметров вложения, когда я комментирую JS, на мой взгляд. Так что, возможно, я не правильно написал свой JS. - person user3318660; 17.05.2016
comment
Пробовали ли вы измениться с этим data : { 'attactment[name]' : name } ? также в пути вам не нужно /:name - person rails_id; 17.05.2016