Ruby on rails rails将参数或变量传递给多个控制器操作

Ruby on rails rails将参数或变量传递给多个控制器操作,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我有一个下拉列表,显示多个“主体”,当用户选择一个主体并点击submit时,表单将主体id参数传递给控制器操作 问题是我需要在多个控制器中使用该params值 我的看法 <div class="row"> <div class="col-sm-12 button-wrapper"> <%= form_tag(principal_analytics_path, method: 'get', class: 'form-inline justify

我有一个下拉列表,显示多个“主体”,当用户选择一个主体并点击submit时,表单将主体id参数传递给控制器操作

问题是我需要在多个控制器中使用该params值

我的看法

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

您可以使用从控制器返回的数据填充隐藏的表单元素(
hidden\u field
)。这些字段将其值作为参数/数据提交给表单的操作,就像任何其他表单元素一样。注意:这是不安全的,用户可以很容易地操纵它,所以如果这是一个问题,不要使用这种方法


或者,您可以将这些数据存储在Rails的变量中。此会话在服务器中维护,可用于跨多个请求存储数据。请注意,要做到这一点,您应该确保有一个合理的方法使会话数据过期或删除,以避免(1)保留超过您需要的数据;(2)令人困惑的用户体验,他们期望一个新的空白表单,但在多次单击之前填充了数据。

您可以使用从控制器返回的数据填充隐藏的表单元素(
隐藏字段
)。这些字段将其值作为参数/数据提交给表单的操作,就像任何其他表单元素一样。注意:这是不安全的,用户可以很容易地操纵它,所以如果这是一个问题,不要使用这种方法


或者,您可以将这些数据存储在Rails的变量中。此会话在服务器中维护,可用于跨多个请求存储数据。请注意,要做到这一点,您应该确保有一个合理的方法使会话数据过期或删除,以避免(1)保留超过您需要的数据;(2)混乱的用户体验,他们希望有一个新的空白表单,但在许多次单击之前就填充了数据。

我最终如何使其工作是创建一个类级变量
@@class_变量
,然后在接收参数的控制器操作中设置它,然后我可以在其他控制器操作中使用该参数

虽然不确定这是否是正确的方法,但它确实有效

# 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

我最终使它工作的方法是创建一个类级变量
@@class_变量
,然后在接收参数的控制器操作中设置它,然后在其他控制器操作中使用该参数

虽然不确定这是否是正确的方法,但它确实有效

# 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

使用会话变量,这就是它们的用途

session[:prid] = params[:prid]
您甚至可以在
ApplicationController
中设置一个方法,以便在需要时为您提供主体

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

现在只需在需要的地方使用当前的原则。(如果您还没有选择一个,它将是
nil

使用会话变量,这就是它们的用途

session[:prid] = params[:prid]
您甚至可以在
ApplicationController
中设置一个方法,以便在需要时为您提供主体

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

现在只需在需要的地方使用当前的原则。(如果您还没有选择,它将是
nil

为什么不在
应用程序控制器中定义方法呢。这样,您可以在继承的每个控制器中使用它it@sovalina听起来像是需要跨请求持久化的数据(例如,来自用户选择的数据)。方法可以在给定用户选择的情况下获得所需的信息,但不能在单个请求之外为您提供保存该信息的方法。为什么不在
ApplicationController
中定义该方法呢。这样,您可以在继承的每个控制器中使用它it@sovalina听起来像是需要跨请求持久化的数据(例如,来自用户选择的数据)。在用户选择的情况下,一种方法可以为您提供所需的信息,但它不能为您提供一种在单个请求之外保存该信息的方法。只有当一次只有一个用户在使用您的应用程序时,这种方法才有效!当第二个用户出现时,情况就会恶化。只有一次只有一个用户在使用您的应用程序时,这才有效!当第二个用户出现时,情况就会恶化。