将 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.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>
我正在使用 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.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>