哪里是Ruby on Rails中文本查找的正确位置

时间:2014-07-05 21:31:50

标签: ruby-on-rails erb

与Rails Way"保持一致,在这样的视图中输出文本的正确/接受/最佳实践方法是什么:

<!-- show.html.erb -->

<% if @post.status == "PUBLISHED" %>
   Big long text about being published.
<% elsif @post.status == "DRAFT" %>
   Big long text about under being a draft post.
<% elsif @post.status == "UNDER_REVIEW" %>
   Big long text about being under review.
<% end %>

这应该委托给一个方法吗?如果是这样,那么该方法应该在哪里定义?

3 个答案:

答案 0 :(得分:3)

嗯,我不知道MCV,但用红宝石术语来说:

<% case @post.status %>
    <% when "PUBLISHED" %>
        Big long text about being published.
    <% when "DRAFT" %>
        Big long text about under being a draft post.
    <% when "UNDER_REVIEW" %>
        Big long text about being under review.
<% end %>

但是,如果您的文本是静态的或依赖于或可从状态计算,则可以呈现特定的部分。例如,您可能有:

_PUBLISHED.html.erb_DRAFT.html.erb_UNDER_REVIEW.html.erb

在这种情况下,您可以用以下内容替换所有内容:

<%= render "#{@post.status}" %>

答案 1 :(得分:1)

名义上的观点,如果您只考虑MVC。除非文本是我可能理解的数据模型所固有的,否则这就是视图逻辑。

那就是说,为了回答你关于委托给一个方法的问题,我认为应该和它的正确位置是装饰器。 Draper gem仅适用于您的视图的此类面向对象逻辑。你可以试试看看那里。

答案 2 :(得分:1)

我通常喜欢将这种逻辑提取到装饰器(通过draper)或单独的类

装饰

#app/decorators/post_decorator.rb
class PostDecorator < Drapper::Decorator
  delegate_all

  def decorated_text
    if status == 'PUBLISHED'
      return "big published text"
    elsif status == 'DRAFT'
      return "big draft text"
    elsif status == 'UNDER_REVIEW'
      return "big under_review text"
    end
  end
end

您可以在装饰@post.decorated_text

上致电@post

单独的课程

class PostText
  def initialize(post)
    @post = post
  end

  def decorated_text
    if @post.status == 'PUBLISHED'
      return "big published text"
    elsif @post.status == 'DRAFT'
      return "big draft text"
    elsif @post.status == 'UNDER_REVIEW'
      return "big under_review text"
    end
  end
end

您可以将其用作

@text = PostText.new(@post)
text = @text.decorated_text

在这两种情况下,您的观点应该是干净的

<!-- show.html.erb -->

<%= @decorated_post.decorated_text %>

<!-- show.html.erb -->

<%= @text.decorated_text %>

注意:

有时为每个州提供额外的模板已被证明是有用的,但前提是更改的部分内部有某种html,或者它真的很大。