рельсы передают параметры или переменную нескольким действиям контроллера - PullRequest
0 голосов
/ 22 октября 2018

У меня есть выпадающий список, который отображает несколько «принципалов», когда пользователь выбирает принципала и нажимает кнопку «Отправить», передает параметру основного идентификатора действие контроллера.

Проблема в том, что мне нужно это значение параметра в нескольких контроллерах.

мой взгляд

  <div class="row">
    <div class="col-sm-12 button-wrapper">
      <%= form_tag(principal_analytics_path, method: 'get', class: 'form-inline justify-content-center') do %>
        <%= select_tag 'prid', options_from_collection_for_select(Principal.all, :id, :name), :prompt => "Select Principal", class: "form-control wrapper-space" %>
        <%= submit_tag "Search", class: 'btn btn-primary wrapper-space', :name => nil %>
      <% end %>
      <%= link_to "Clear", principal_analytics_path, class: "text-danger" %>
    </div>
  </div>

действие контроллера

как только я получаю выбранные "книги" принципалов, мне нужен способ передачи переменной @pri_books от одного контроллера к другому,Или способ просто передать params [: prid] `нескольким действиям контроллера.Я не уверен, как это сделать.Может быть, функция, которая передает переменную от одного контроллера к другому?

  # displays graphs about principals.
  def principal_analytics

    @months_back = 12

    if params[:prid].present?
      # takes a principals id as a parameter.  
      # @months_back will determine how many months are shown in the chart.
      @pri_books = Book.principal_books(params[:prid], @months_back)  
    end

    respond_to do |format|
      format.html 
      format.js {}
      format.json { render json: {success: true}}
    end    
  end

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

В результате я получил переменную уровня класса @@class_variable, а затем просто установил ее в действии контроллера, получая параметры, которые я мог затем использовать в других действиях контроллера.

Не уверен, что это правильный способ сделать это или нет, но это работает.

# class level variable outside of any action
 @@principals_books = nil

    # displays graphs about principals.
      def principal_analytics

        @months_back = 12

        if params[:prid].present?
          # takes a principals id as a parameter.  
          # @months_back will determine how many months are shown in the chart.
          @pri_books = Book.principal_books(params[:prid], @months_back) 

          # set the data from the local instance variable to the class variable
          @@principals_books = @pri_books 
        end

        respond_to do |format|
          format.html 
          format.js {}
          format.json { render json: {success: true}}
        end    
      end

    def another_action
      @local_variable = @@principals_books
      @local_variable.do_something
    end
0 голосов
/ 23 октября 2018

Используйте переменную сеанса, вот для чего они здесь ...

session[:prid] = params[:prid]

Вы можете даже настроить метод в вашем ApplicationController, чтобы дать вам принципал, когда вам это нужно..

class ApplicationController < ActionController::Base
  def current_principal
    principal.find_by(id: session[:prid])
  end
end

Теперь просто используйте current_principal там, где вам это нужно.(Это будет nil, если вы еще не выбрали один)

0 голосов
/ 22 октября 2018

Вы можете использовать данные, полученные от контроллера, для заполнения скрытых элементов формы (hidden_field).Эти поля будут отправлять свои значения в виде параметров / данных, как и любой другой элемент формы, для действия формы.Примечание: это небезопасно и может быть легко изменено пользователями, поэтому, если это важно, не используйте этот метод.

В качестве альтернативы, вы можете сохранить эти данные в переменной Rails ' session ,Этот сеанс поддерживается на сервере и может использоваться для хранения данных по нескольким запросам.Помните, что для того, чтобы сделать это правильно, вы должны убедиться, что у вас есть разумный метод для истечения срока действия или удаления данных сеанса, чтобы избежать (1) хранения большего количества данных, чем вам нужно, и (2) запутанного пользовательского опыта, когда они ожидали новую пустую форму, но имелиданные, заполненные многими кликами назад.

...