Rails重用:为什么控制器不能在局部内部重用?

时间:2016-06-14 09:29:25

标签: ruby-on-rails model-view-controller

新手到Rails,一直在玩,并试图了解有关约定的事情& MVC方法。来自原始对象背景,有一些困扰我的轨道范例,我无法找到关于理由/最佳方法的好建议。

部分仅用于渲染视图?它不会调用控制器'。

让我举例说明:说一个主页有3个对象,3个控制器和3组视图

  • 用户
  • 地址
  • 用户历史记录

如果我想要一个实际显示来自所有模型的内容的登录主页,我似乎必须创建一个“网站控制器”'和视图,这是家,页面,但我必须复制逻辑'在站点控制器中为用户,地址和用户历史记录设置变量,然后通过各种部分/表格进行访问。

在测试中,我设置了3组测试,以使所有视图和数据都能正常工作。 但是在组合主页中,我似乎必须将控制器逻辑复制到" site"中心/主页。

在一个"对象世界"我的大脑说我可以嵌入控制器调用来支持视图,所以我可以简单地重用地址,用户和用户历史记录控制器。 * 或者我完全错过了一些关于它是如何工作的东西。欢迎专家观点或指导我误解的内容。*

这些例子似乎过于强化了我的观点,似乎提供了解决方案

  1. reuse the view only
  2. to reuse a controller use a super class
  3. 干杯 本

1 个答案:

答案 0 :(得分:1)

不,部分人不会给控制器打电话。您在控制器中实例化您需要的对象。因此,如果您想要渲染地址部分,您将获得控制器中的地址。

如果你需要在所有页面上全部3个,你可以创建控制器关注点,这些关注点对它们有前面的操作

module GetStuff
  extend ActiveSupport::Concern

  included do
    before_action :set_user
    before_action :set_address
  end

  def set_user
     @user = # code for getting user
  end
end

class UsersController
  include GetStuff
end

或者假设您从应用程序控制器继承,您可以在那里为它们设置一个before操作(但如果您有其他控制器继承它,那可能不是最好的主意。

如果经常使用它们,可以将方法放在应用程序控制器中并设置辅助方法,以允许从视图和控制器访问方法。

class ApplicationController
  def current_user
    @current_user = #code to get user
  end
  helper_method :current_user
end

# Some view
<% if current_user %>
  <%= current_user.username %>
<% end %>

或者你可以在助手中使用方法

module ApplicationHelper
  def current_user
    @current_user = #code to get user
  end
end

或者可能地址也与用户相关联,您可以创建一个外观并简单地在控制器中实例化

class UserController
  def show
    @user_facade = UserFacade.new(User.find(params[:id])
  end
end

class UserFacade
  attr_reader :user

  def initialize(user)
    @user = user
  end

  def address
    @address ||= user.address
  end

  def user_history
    @user_history ||= user.history
  end
end

# users/show.html.erb

<%= render @user_facade.user %>
<%= render @user_facade.address %>
<%= render @user_facade.user_history %>