将 JavaScript 变量保存到 Rails 模型

Save JavaScript Variable to Rails Model

我正在使用 FileStack API 和文件选择器 gem (https://github.com/Ink/filepicker-rails)。我按照使用 OnChange 访问 FilePicker 文件下的文档中概述的步骤进行操作。我试图获取 JSON 浏览器响应属性,文件名,通过路由将其传递到我的 Rails 控制器,并将其保存为我的附件模型中的 :name 。

Attachment/New 查看

<%= 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 帖子,这就是我如何实现这个实现的。但是,当我在 rails 控制台中查看我的附件模型时,名称为零。我的数据没有正确传递。我不确定我是否遗漏了一个步骤或没有正确路由。任何建议将不胜感激。

@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
..
..

哦,你也可以在参数方法中合并,而不是在操作中合并。

def attachment_params
 params.require(:attachment).permit(:user_id).merge(name: params[:name])
end

你的控制器超级乱,删除了大部分,只是保持简单,如下所示。这一行将涵盖 current_user.idname.

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>