在Rails中显示不同类型的对象

时间:2013-07-30 19:20:55

标签: ruby-on-rails

我正在尝试做什么

我在我的rails应用程序中使用Sphinx搜索几个不同的模型,并成功返回加权结果(包括几种不同类型的对象,比如帖子和用户)。我目前正在使用(many.each { |one| one.inspect })对此进行测试,并且工作正常。

我现在正在尝试为每个具有相同名称的模型编写一个方法,该方法将以我选择的格式输出我的对象。例如,我想放置one.inspect而不是one.print_pretty,并输出html,它整齐地打印出特定于该类型对象的信息。使用用户示例,我希望它输出如下内容:

<div class="small-2 columns">
    <%= image_tag(one.userpic.avatar.url) %>
</div>
<div class="small-10 columns">
    <div class="row">
        <h3 class="subheader"><%= one.first + " " + one.last %></h3>
    </div>
    <div class="row">
        <%= one.tagline %>
    </div>
</div>

相比之下,在我的帖子模型中,它应该输出适用于帖子属性和优先级的不同内容。

问题

如何为Rails模型编写一个方法,该模型将输出一个html风格的块来代码或以其他方式设置未知对象类型的输出(来自有限的池)?

1 个答案:

答案 0 :(得分:0)

这样的事情对你有用吗?您可以创建一个单独的部分,为每个对象类显示不同的输出。在您的视图中,将对象传递给辅助方法函数。例如:

<%= render_partial_for_this_type_of_object(your_object) %>

然后在辅助方法中,有类似的东西:

def render_partial_for_this_type_of_object(object)
    if object.class.name == "ClassA"
        render 'class_a_partial', :object => object
    elsif object.class.name == "ClassB"
         render 'class_b_partial', :object => object
    end
end

总而言之,您将对象从视图传递给帮助程序,确定它是什么类对象,然后根据其将在视图中呈现的类将该对象传递给适当的部分。

我确信还有其他方法可以做到这一点,但这对我来说非常适合我刚建立的应用程序。