【问题标题】:In Rails how do I display only the value of a hash item within an array?在 Rails 中,如何仅显示数组中哈希项的值?
【发布时间】:2012-03-27 21:35:39
【问题描述】:

我是 ruby​​/rails 的新手,正在尝试构建一个简单的项目/标签应用程序,其中项目和标签作为 has_and_belongs_to_many 相互关联。它基本上是一个带有关联标签的项目的简单列表,而这些标签又可以被多个项目重复使用。

我一直在将标签加载到这样的项目中:

my_project = Project.create(:name => "My Project")
my_tag = Tag.create(:content => "My Tag")
my_project.tags << my_tag

在我尝试将信息加载到我的视图之前,一切看起来都很好。我有一个项目列表,每个项目下面都有一个小表格,列出了相关的标签:

<table>
 <% @projects.each do |project| %>
   <table>
     <tr>
       <td width="300"><%= project.name %></td>
       <td width="100"><%= link_to 'Edit project', edit_project_path(project) %></td>
       <td width="100"><%= link_to 'Nuke project', project, :confirm => 'Are you sure?', :method => :delete %></td>
     </tr>
   </table>
   <table>
     <tr>
       <td><%= project.tags %></td>
     </tr>
   </table>
 <% end %>
</table>

我得到的视图输出是:

[1] My Project               Edit Project      Nuke Project
[2] [#<Tag id: 1, content: "My Tag", created_at: "2012-03-27 19:27:26", updated_at: "2012-03-27 19:27:26">, #<Tag id: 2, content: "My Other Tag", created_at: "2012-03-27 19:41:04", updated_at: "2012-03-27 19:41:04">]

在第 [2] 行中,我如何只显示 :content 的值而不是整个哈希值?另外 - 这是我应该如何将标签与项目相关联吗?

如果有人能指出我正确的方向,那就太好了。非常感谢!

谢谢! 杰森

【问题讨论】:

    标签: ruby-on-rails arrays hash associations has-and-belongs-to-many


    【解决方案1】:

    project.tags 将返回一个数组,因此您需要遍历每个项目并显示它。例如尝试:

    project.tags.map {|tag| tag.content}.to_sentence
    

    Map 循环遍历每个标签,我们显示每个标签的内容,最后输出到一个句子中。

    还有许多其他方法可以做到这一点。请查看the array methods 了解更多信息。

    关于另一个问题,has_and_belongs_to_many 很好,但为了获得更大的灵活性,请尝试使用 has_many :through,如 here 所述。而here 就是其背后的原因。

    【讨论】:

    • 谢谢!这完美无缺。我将查找 has_many :through 以用于此应用程序的下一次迭代。再次感谢您的帮助!
    • 实际上,您建议的地图循环是我可以(或应该)移动到模型中的东西吗?或者将其保留在视图中是否有意义?仍在尝试围绕 MVC 框架中的意义进行思考。再次感谢!
    • 最好的做法是使用瘦视图,因为它们更易于维护,因此您可以在模型中定义一个返回所需内容的方法,并且因为此方法直接与模型。但是,如果您想在视图中使用相同的功能,但对于多个模型,您可以创建一个帮助器。
    • 澄清一下,map 和 collect(它们非常相似)本身不是迭代器。它们遍历数组中的项目并返回一个不同的数组。 to_sentence 方法是 Rails 数组扩展,它只使用 .join(", ") 并添加更多逻辑以使输出更人性化。另外,我知道很多教程/书籍说你不需要先了解 ruby​​,因为你会一路学习,相信我(我也是初学者),你会学会使用 Rails way 如果你先学习 ruby​​ 的基础知识,速度会更快。
    • 感谢 Shuriu - 绝对是同时积累了我的 Ruby 知识。欣赏提示!
    【解决方案2】:

    如果您使用的是 Rails 3.2,则可以使用pluck 方法仅提取内容

    <%= project.tags.pluck(:content).join(",") %>
    

    【讨论】:

    • 感谢您的提示!我用的是Rails 3.0,不过升级的时候肯定会试试pluck的方法。
    猜你喜欢
    • 1970-01-01
    • 2017-07-09
    • 2015-06-27
    • 2022-11-23
    • 2016-06-27
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多