Как передать переменную javascript из представления Rails в действие - PullRequest
0 голосов
/ 09 июля 2019

У меня есть список электронных писем пользователей в небольшом количестве кода 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, в которой мне сообщают: «Вы не авторизованы ...». Это связано с тем, что URL-адрес фактически содержит параметры и пытается перенаправить меня на несуществующую веб-страницу.

1 Ответ

1 голос
/ 10 июля 2019

Я реализовал действие, которое загружает файл с js на S3 и устанавливает значение поля формы с помощью javascript, затем я использую этот URL в действии администратора rails.

Я все это вставляю, потому что в прошлом это помогло бы мне в этих случаях, сравнив мой подход с подходом к работе.

Вот соответствующие (упрощенные) файлы:

# 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

...