【问题标题】:Rendering a template based on object type in Rails在 Rails 中根据对象类型渲染模板
【发布时间】:2013-04-05 16:16:44
【问题描述】:

我正在编写一个小型论坛应用程序,用户可以在其中创建不同类型的论坛。例如,公告、讨论或问题论坛。

论坛模型有很多帖子,还有一个forum_type 专栏。我想根据@post.forum_type 列使用不同的模板渲染posts#show

因此,每个论坛根据其类型,其帖子都会有不同的外观。

我怎样才能做到这一点而不用if @post.forum_type == 'something' 乱扔我的代码...?

【问题讨论】:

  • 在其他想法中,如果您只使用类似:render :template => 'forums/forum_type_here' 但在 render 语句中使用 @post.forum_type 变量...类似这样:render :template => @post.forum_type(或者如果它是一个字符串,也可以在 @post.forum_type 变量上附加一些东西。)
  • 好主意。没有我想要的那么干净,但是一个很好的选择。

标签: ruby-on-rails ruby templates rendering


【解决方案1】:

代表团。编写一个帖子渲染器,然后为每个论坛类型实现一个具体的渲染器子类:

class Post
  attr_accessor :forum_type       
end

class BaseRenderer
  def renderer_for(post) 
    # create the correct renderer for the post here
  end

  def render_post(post)
    renderer = renderer_for(post)
    renderer.to_html  # return the results
end

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

  def render
    # render the post for forum A here\
  end
end

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

  def render
    #render post for forum B here
  end
end

这意味着您可以通过仅实现一个渲染器并向 renderer_for 方法添加一点逻辑来轻松地为不同的论坛设置皮肤。

【讨论】:

  • 谢谢!有声音很慢的风险,(我对此很陌生),这些类会在哪里,什么目录?调用代码会是什么样子?它会在控制器中还是在视图中?
  • 它们是视图逻辑,而不是控制器逻辑。我会从 Controller 中调用它们 - 它们本质上只是稍微复杂一些的模板,其中包含一些以更易于管理的方法的条件表示逻辑。
  • 抱歉听起来很迟钝,但render 方法会渲染适合对象的html?还是我会从中调用模板?
  • 随你喜欢。显然,从维护的角度来看,使用模板会更好,但关键是通过执行上述操作,您已经将如何决定渲染哪个模板与渲染该模板的行为分开。
猜你喜欢
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
  • 2013-11-28
  • 1970-01-01
  • 2010-11-18
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多