如何将 javascript 变量从 Rails 视图传递到操作
How to pass javascript variable from Rails view to action
在我看来,我为自己的操作创建了一些 Javascript 代码,其中包含用户电子邮件列表。视图采用 haml 格式。
我想按表单上的提交按钮并在同一操作或其他操作中访问此电子邮件列表。
我试过使用 form_tag、form_for 和普通的 html 形式,但是我将 运行 用于不同的问题。我还测试了 link_to 和 button_to 标签。
以下是我们的行动:
module RailsAdmin
module Config
module Actions
class BulkProperties < RailsAdmin::Config::Actions::Base
RailsAdmin::Config::Actions.register(self)
register_instance_option :collection do
true
end
register_instance_option :http_methods do
[:get, :put]
end
register_instance_option :controller do
proc do
@all_users = User.all
@all_properties = UserProperty.all
@all_roles = Role.all
binding.pry
if request.get? # EDIT
respond_to do |format|
format.html { render @action.template_name }
format.js { render @action.template_name, layout: false }
end
elsif request.put? # UPDATE
binding.pry #Just testing this
end
end
register_instance_option :link_icon do
'icon-lock'
end
end
end
end
end
这是我的观点中给我带来问题的部分:
%form
.multiselect-form
.wrapper{"data-children-count" => "1"}
%select.collection{:multiple => "multiple", :id => "multi"}
%hr/
%h1 List of user properties
-@all_properties.each do |prop|
%input{:name => prop.name+"checkbox", :type => "checkbox", :id => prop.name+"checkbox"}
#{prop.name}
%input{:name => prop.name, :type => "text", :id => prop.name}
%br
%input{:name => "submit", :type => "submit", :formaction => 'http://localhost:3000/admin/user/bulk_properties?Application=8&Company=1&locale=en', :method => 'put'}
%br/
%br/
结果是我遇到了一个 CanCan 问题,我遇到了 'You are not authorized...'。这是因为 url 实际上最终保留了参数,因此它试图将我重定向到一个不存在的网页。
我实施了一个操作,将带有 js 的文件上传到 S3 并使用 javascript 设置表单字段的值,然后我在 rails 管理操作中使用 url。
我将其全部粘贴,因为在过去,通过将我的方法与有效方法进行比较,在这些情况下会对我有所帮助。
以下是相关(简化)文件:
# app/views/rails_admin/main/update_orders_and_line_items.html.haml
= form_tag(method: :post) do
= hidden_field_tag 'uploaded-file-url', '', id: 'uploaded-file-url'
= submit_tag 'Submit', class: 'action-button-pink'
# app/assets/javascripts/google_cloud_storage_field.js
let url = get_url(fileInput);
let valueField = $('#uploaded-file-url');
valueField.val(url);
# lib/rails_admin/config/actions/update_orders_and_line_items.rb
module RailsAdmin
module Config
module Actions
class UpdateOrdersAndLineItems < RailsAdmin::Config::Actions::Base
# Might cause random bugs if enabled
register_instance_option :pjax? do
false
end
register_instance_option :http_methods do
[:post, :get]
end
register_instance_option :controller do
proc do
if request.post?
url = params['uploaded-file-url']
do_stuff_with(url)
elsif request.get?
# [...]
end
end
end
end
end
end
end
我相信你的错误来源是使用 %form
标签,表单的默认方法是 GET,这就是为什么你的浏览器会尝试将你重定向到某个页面,如果你像我一样使用 form_tag(method: :post)
并确保电子邮件在 hidden_field_tag 值上,您将在 action.rb
上获得您的列表
在我看来,我为自己的操作创建了一些 Javascript 代码,其中包含用户电子邮件列表。视图采用 haml 格式。 我想按表单上的提交按钮并在同一操作或其他操作中访问此电子邮件列表。
我试过使用 form_tag、form_for 和普通的 html 形式,但是我将 运行 用于不同的问题。我还测试了 link_to 和 button_to 标签。
以下是我们的行动:
module RailsAdmin
module Config
module Actions
class BulkProperties < RailsAdmin::Config::Actions::Base
RailsAdmin::Config::Actions.register(self)
register_instance_option :collection do
true
end
register_instance_option :http_methods do
[:get, :put]
end
register_instance_option :controller do
proc do
@all_users = User.all
@all_properties = UserProperty.all
@all_roles = Role.all
binding.pry
if request.get? # EDIT
respond_to do |format|
format.html { render @action.template_name }
format.js { render @action.template_name, layout: false }
end
elsif request.put? # UPDATE
binding.pry #Just testing this
end
end
register_instance_option :link_icon do
'icon-lock'
end
end
end
end
end
这是我的观点中给我带来问题的部分:
%form
.multiselect-form
.wrapper{"data-children-count" => "1"}
%select.collection{:multiple => "multiple", :id => "multi"}
%hr/
%h1 List of user properties
-@all_properties.each do |prop|
%input{:name => prop.name+"checkbox", :type => "checkbox", :id => prop.name+"checkbox"}
#{prop.name}
%input{:name => prop.name, :type => "text", :id => prop.name}
%br
%input{:name => "submit", :type => "submit", :formaction => 'http://localhost:3000/admin/user/bulk_properties?Application=8&Company=1&locale=en', :method => 'put'}
%br/
%br/
结果是我遇到了一个 CanCan 问题,我遇到了 'You are not authorized...'。这是因为 url 实际上最终保留了参数,因此它试图将我重定向到一个不存在的网页。
我实施了一个操作,将带有 js 的文件上传到 S3 并使用 javascript 设置表单字段的值,然后我在 rails 管理操作中使用 url。
我将其全部粘贴,因为在过去,通过将我的方法与有效方法进行比较,在这些情况下会对我有所帮助。
以下是相关(简化)文件:
# app/views/rails_admin/main/update_orders_and_line_items.html.haml
= form_tag(method: :post) do
= hidden_field_tag 'uploaded-file-url', '', id: 'uploaded-file-url'
= submit_tag 'Submit', class: 'action-button-pink'
# app/assets/javascripts/google_cloud_storage_field.js
let url = get_url(fileInput);
let valueField = $('#uploaded-file-url');
valueField.val(url);
# lib/rails_admin/config/actions/update_orders_and_line_items.rb
module RailsAdmin
module Config
module Actions
class UpdateOrdersAndLineItems < RailsAdmin::Config::Actions::Base
# Might cause random bugs if enabled
register_instance_option :pjax? do
false
end
register_instance_option :http_methods do
[:post, :get]
end
register_instance_option :controller do
proc do
if request.post?
url = params['uploaded-file-url']
do_stuff_with(url)
elsif request.get?
# [...]
end
end
end
end
end
end
end
我相信你的错误来源是使用 %form
标签,表单的默认方法是 GET,这就是为什么你的浏览器会尝试将你重定向到某个页面,如果你像我一样使用 form_tag(method: :post)
并确保电子邮件在 hidden_field_tag 值上,您将在 action.rb