如何限制我在Ruby on Rails中从控制器传入的数据

时间:2015-10-20 14:18:23

标签: ruby-on-rails ruby rails-activerecord

class Board < ActiveRecord::Base
  has_many :applications, dependent: :destroy
end

class Application < ActiveRecord::Base
  belongs_to :board
  validates_presence_of :board
  has_many :interactions, dependent: :destroy
end

class Interaction < ActiveRecord::Base
  belongs_to :application
  validates_presence_of :application
end

鉴于上述ActiveRecords,在boards_controller的show方法中,我可以致电@boards.applications,即使我没有明确调用application.interactions,我仍然可以访问视图中的交互。但是,对于这个特定的视图,我只需要一个交互,这是通过一些与nil检查和排序有关的逻辑收集的。

我宁愿在控制器中执行此逻辑,只传递一个交互而不是每个应用程序的所有额外内容,但目前它已通过所有这些,我无法明确添加{控制器中的{1}}因为它是一个未知属性。

如何为每个应用程序设置一个交互,以及在Ruby on Rails中执行此操作的正确方法是什么?

以下是我最终要做的事情:

application.current_interaction模型应如下所示:

application

然后可以在class Application < ActiveRecord::Base belongs_to :board validates_presence_of :board has_many :interactions, dependent: :destroy def current_interaction #logic here return interaction end end 的视图中调用它,根本不应该对控制器进行任何更改。

2 个答案:

答案 0 :(得分:1)

我认为从interactions检索application时,延迟加载是默认行为,因此在您调用application.interactions之前,不应该从数据库中获取它们。但是,你说你没有明确地致电application.interactions,那么你怎么看到他们可以访问?

你可以包装&#34; nil检查和排序&#34; current_interaction上的Application方法中的逻辑,除非您明确调用它们,否则不应加载interactions

答案 1 :(得分:0)

如果模型板与应用程序有关系,则@board 中具有Board对象的任何内容都可以调用@board.applications以获取与该板相关联的所有应用程序。没有办法阻止这种情况。

但仅仅因为它可以调用它来获取所有应用程序并不意味着必须这样做。除非你想要那块板子的所有应用程序,否则不要看@ board.applications。

如果相反:

  

但是,对于这个特定的视图,我只需要一个交互,这是通过一些与nil检查和排序有关的逻辑收集的。

     

我宁愿在控制器中执行此逻辑,只传递一个交互而不是每个应用程序的所有额外内容,

没问题!就这样做。您只是将其作为@board的属性传递给视图,它将成为它自己的事物。

 # in controller
 @current_interaction = find_current_interaction_for(@board)

 # Or, instead, use template-parameters instead of using ivars
 render "some_template", :locals => {:board => @board, :current_interaction => find_current_interaction_for_board(@board)}

您无法移除&#34;访问视图中的互动&#34; - 只要在模型中定义关系,它们就可以访问&#34;。但是如果没有代码访问@board.interactions,他们就不会被实际加载,直到被访问。

但是如果所有的交互都不是你想要的,但只有一个,你想在控制器中计算出某个 - 只需在控制器中计算它并将其作为一个传递给它单独的参数。你不得不考虑以某种方式从Board模型中获取current_interaction所需的视图,但它并没有。如果在控制器中计算它是有意义的,那么控制器必须单独将它传递给视图。 @ board.applications将永远是董事会的所有应用程序,如果你不希望所有的应用程序都不看那个属性,把你想要的东西放在其他地方。