新手到Rails,一直在玩,并试图了解有关约定的事情& MVC方法。来自原始对象背景,有一些困扰我的轨道范例,我无法找到关于理由/最佳方法的好建议。
部分仅用于渲染视图?它不会调用控制器'。
让我举例说明:说一个主页有3个对象,3个控制器和3组视图
如果我想要一个实际显示来自所有模型的内容的登录主页,我似乎必须创建一个“网站控制器”'和视图,这是家,页面,但我必须复制逻辑'在站点控制器中为用户,地址和用户历史记录设置变量,然后通过各种部分/表格进行访问。
在测试中,我设置了3组测试,以使所有视图和数据都能正常工作。 但是在组合主页中,我似乎必须将控制器逻辑复制到" site"中心/主页。
在一个"对象世界"我的大脑说我可以嵌入控制器调用来支持视图,所以我可以简单地重用地址,用户和用户历史记录控制器。 * 或者我完全错过了一些关于它是如何工作的东西。欢迎专家观点或指导我误解的内容。*
这些例子似乎过于强化了我的观点,似乎提供了解决方案
答案 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 %>