How*_*ard 11 ruby templates ruby-on-rails presentation-layer
一些建议[1]建议你使用
<%= current_user.welcome_message %>
Run Code Online (Sandbox Code Playgroud)
代替
<% if current_user.admin? %>
<%= current_user.admin_welcome_message %>
<% else %>
<%= current_user.user_welcome_message %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
但问题是你必须在代码中的某个地方拥有决策逻辑.
我的理解是把决定放在template最好,而不是controller让你的控制器更干净.这是对的吗?
有没有更好的方法来处理这个?
cjh*_*eal 10
你不是第一个想到这一点的人.如果视图和控制器应该几乎没有逻辑,并且模型应该是表示不可知的,那么表示逻辑属于哪里?
事实证明,我们可以使用一种称为装饰模式的旧技术.我们的想法是用另一个包含表示逻辑的类包装模型对象.这个包装类叫做装饰器.装饰者从您的视图中抽象出逻辑,同时保持您的模型与其演示文稿隔离.
Draper是一个很好的宝石,可以帮助定义装饰器.
您提供的示例代码可以像这样抽象:
将装饰器传递给@user = UserDecorator.new current_user控制器中的视图.
你的装饰师可能如下所示.
class UserDecorator
decorates :user
def welcome_message
if user.admin?
"Welcome back, boss"
else
"Welcome, #{user.first_name}"
end
end
end
Run Code Online (Sandbox Code Playgroud)
你的观点只会包含 @user.welcome_message
请注意,模型本身不包含创建消息的逻辑.相反,装饰器包装模型并将模型数据转换为可呈现的形式.
希望这可以帮助!
我会用这个帮手.假设您必须根据某些区域设置翻译欢迎消息.
在app/helper/user_helper.rb写
module UserHelper
def welcome_message(user)
if user.admin?
I18n.t("admin_welcome_message", :name => user.name)
else
I18n.t("user_welcome_message", :name => user.name)
end
end
end
Run Code Online (Sandbox Code Playgroud)
在你看来,你可以写
<%= welcome_message(user) %>
Run Code Online (Sandbox Code Playgroud)
请注意,装饰器/演示者提供了一种非常干净的面向对象的方法,但使用帮助器的imho更加简单和充分.
| 归档时间: |
|
| 查看次数: |
573 次 |
| 最近记录: |