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

时间:2018-10-22 15:47:52

标签: ruby-on-rails ruby-on-rails-4

我有一个下拉菜单,其中显示了多个“主体”,当用户选择一个主体并命中时,该表单会将主体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>

控制器动作

一旦获得选定的主体“书”,然后需要一种将@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 :(得分:3)

使用会话变量,这就是他们要做的...

session[:prid] = params[:prid]

您甚至可以在ApplicationController中设置一个方法,以便在需要时为您提供主体...

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

现在只需在需要的地方使用current_principal。 (如果您还没有选择,它将为nil

答案 1 :(得分:0)

您可以使用从控制器获取的数据来填充隐藏的表单元素(hidden_field)。这些字段将其值作为参数/数据提交,就像表单操作中的任何其他表单元素一样。注意:这是不安全的,并且用户可以轻松地对其进行操作,因此,如果您担心此问题,请不要使用此方法。

或者,您可以将这些数据存储在Rails的session变量中。该会话在服务器中维护,可用于跨多个请求存储数据。请注意,要正确执行此操作,您应该确保有一个明智的方法来过期或删除会话数据,以避免(1)保留的数据量超出您的需要,并且(2)混淆了他们期望使用新的空白表单但存在错误的用户体验多次点击之前填充的数据。

答案 2 :(得分:0)

我最终使它工作的方法是使一个类级变量@@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