与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 %>
这应该委托给一个方法吗?如果是这样,那么该方法应该在哪里定义?
答案 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,或者它真的很大。