将表示逻辑放在控制器中是Ruby的一个好习惯吗?

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让你的控制器更干净.这是对的吗?

有没有更好的方法来处理这个?

http://robots.thoughtbot.com/post/27572137956/tell-dont-ask

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

请注意,模型本身不包含创建消息的逻辑.相反,装饰器包装模型并将模型数据转换为可呈现的形式.

希望这可以帮助!

  • 很公平.我的目的只是以一种对提问者的认知摩擦最小的方式介绍装饰器的概念. (2认同)

nat*_*vda 5

我会用这个帮手.假设您必须根据某些区域设置翻译欢迎消息.

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更加简单和充分.


Ama*_*dan 1

在我看来,如果文本是唯一发生变化的东西,那么它就不属于视图。如果您需要重组页面,那就是表示逻辑。这,这只是数据不一样而已。