Ruby on rails rails将参数或变量传递给多个控制器操作
我有一个下拉列表,显示多个“主体”,当用户选择一个主体并点击submit时,表单将主体id参数传递给控制器操作 问题是我需要在多个控制器中使用该params值 我的看法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
<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听起来像是需要跨请求持久化的数据(例如,来自用户选择的数据)。在用户选择的情况下,一种方法可以为您提供所需的信息,但它不能为您提供一种在单个请求之外保存该信息的方法。只有当一次只有一个用户在使用您的应用程序时,这种方法才有效!当第二个用户出现时,情况就会恶化。只有一次只有一个用户在使用您的应用程序时,这才有效!当第二个用户出现时,情况就会恶化。