Rails 4传递实例变量以查看OOP

时间:2015-07-22 19:03:34

标签: ruby-on-rails-4

我一直在查看Rails-style-guide,它说我不应该在视图中与控制器共享两个以上的实例变量。我和我的观点共享了两个以上的实例变量,因为

  1. 我需要为partials创建新实例,
  2. 我不希望在我的视图中使用长链接方法调用。
  3. 例如,我有一个Group show视图,它传入@ groups,@ users(这是组中的所有用户),@notifications(用户的通知,在下拉列表中随处可用),@活动,@ message(用于留言板)和@message(可以生成的新消息。

    这样我的观点看起来像这样:

    <% @activities.each do |activity| %>
    

    我应该只是传递@group(急切地加载它的用户,消息等)并在我的视图中看到这样的调用吗?:

    <% @group.activities.future_activites.each do |activity| %> ...
    

    感谢。

1 个答案:

答案 0 :(得分:1)

这是一种很好的技巧,可以减少从控制器到视图的对象数量:

https://robots.thoughtbot.com/sandi-metz-rules-for-developers#only-instantiate-one-object-in-the-controller

长话短说,尝试创建一个类或对象,其中包含封装您要共享的信息的方法。

从你的例子中,我可以看到这样的事情:

应用/立面/ group_show.rb

class GroupShow
  attr_reader :group

  def initialize(group)
    self.group = group
  end

  def future_activities
    group.activities.future_activities
  end
end

应用/控制器/ groups_controller.rb

def show
  group = Group.find(params[:id])
  @facade = GroupShow.new(group)
end

应用/视图/组/ show.html.erb

<% @facade.future_activities.each do |activity| %>

或者,对于更简单的版本(特别是因为活动已经是@group对象的一部分,您可以将委托方法直接添加到您的组模型中,如下所示:

应用/模型/ group.rb

def future_activities
  activities.future_activities
end

并像这样访问:

应用/视图/组/ show.html.erb

<% @group.future_activities.each do |activity| %>