在rails中创建用于样式设置的方法

时间:2012-09-03 07:26:18

标签: ruby-on-rails decorator view-helpers

我在rails上有一个非常基本的博客应用程序,我需要帮助创建一个方法。

对于每个帖子,用户必须指定一个社区,为了造型,我想知道该社区是否属于某个桶,以便我可以相应地为该帖子着色。例如,邻居“SOMA”是“市中心”桶的一部分。

我想我要做的就是将邻域传递给一个确定它落入哪个桶的方法,并且我可以以某种方式输出桶以对应于索引中的div类。接受其他建议。

有谁知道这样的方法会在哪里生活?

更新:

我在PostsHelper中添加了一个准确的方法来查看它是否有效,然后我可以充实逻辑

模块PostsHelper

def bucket(neighbor)
    case neighbor
        when "SOMA"
        puts "Downtown"

        when "Mission"
        puts "Dolores"

        else
        puts "foo"
    end

end

然后我尝试在post索引中调用该方法,但没有任何反应。这可能是有史以来最愚蠢的问题,但我错过了什么?这甚至是正确的方法吗?:

<ul id="post-list">
<% @posts.each do |post| %>

<li><%= post.content %></li>
<li><%= post.attribution %> in <%= post.neighborhood %> 
<span class="post-date"><%=time_ago_in_words(post.created_at) %> ago</span></li>
<li> <%= bucket(yield(post.neighborhood)) %> </li> 

<% end %>
</ul>

2 个答案:

答案 0 :(得分:1)

这种方法应该存在于装饰者中。

请参阅此railscast:http://railscasts.com/episodes/286-draper


在您的详细信息后编辑

def bucket(neighbor)
  case neighbor
  when "SOMA"    then "Downtown"
  when "Mission" then "Dolores"
  else
    "foo"
  end
end

在您看来:

<li> <%= bucket(post.neighborhood) %> </li>

但你应该考虑使用装饰器。

答案 1 :(得分:0)

你可以做的是创建一个资源(表+模型,Bucket)来跟踪你关心的桶 - 也许Bucket name属性包含你提到的更大地理区域的名称。然后你可以让Post属于Bucket。

在您的视图中,您可以使用post.bucket.name填充帖子容器的类,然后使用您的预设颜色和诸如此类的东西为不同的存储桶名称创建样式。

如果您想提高查询效率:

如果采用这种方法,请考虑将Bucket name属性缓存为Post的属性(因此每次呈现视图时都不必进行额外的查询)。仍然具有Bucket类(而不仅仅是Post模型中的bucket_name属性)的目的是使您可以规范化Bucket名称,并可能自己更新它们。要确保在Post记录中更新缓存的bucket_name属性,可以在Bucket模型中创建一个after_update回调,选择属于该Bucket的所有Post,并更新其bucket_name属性。