如何在 Rails 中使用 Espinita 迭代多个哈希值



我正在使用Espinita来跟踪对我的模型的更改,并且有多个属性,我想在视图中显示。

我还没有弄清楚如何在迭代器中不使用||的情况下迭代每个值。我想获取属性名称、更改的值和日期。

这是显示.html:

<% @contract.contract_information.history_from_audits_for([:contract_title, :assigned_to, :action_requested..:deadline]).each do |changes| %>
<tr>
<%= changes[:contract_title] || changes[:assigned_to] || changes[:deadline] %>
<%= changes[:changed_at].strftime("%m/%d/%Y") %>
</tr>
<% end %>

如何在不引用属性名称的情况下循环访问每个审核?

更新

进行建议的更改后。我现在以数组形式接收属性/值。有没有办法美化视图中的结果?

输出

11/20/2019  [:contract_stage, ""] [:action_requested, ""] [:reason_for_contract_request, ""] [:existing_or_returning, ""] [:background_check_status, ""] [:priority, ""] [:deadline_date, Wed, 20 Nov 2019] [:commencement_date, Wed, 20 Nov 2019]  davie200

视图

<% @contract.contract_information.history_from_audits_for([:contract_stage, :action_requested, :reason_for_contract_request, :deadline_date, :commencement_date, :existing_or_returning, :background_check_status, :priority]).each do |audit| %>
<% audit.except(:changed_at).each do |attribute, value| %>
<tr>
<td><%= audit[:changed_at].strftime("%m/%d/%Y") %></td>
<td>
<% value.each do |val| %>
<%= val %>
<% end %>
</td>
<td><%= @contract.contract_information.audits.last.user.username %></td>
</tr>
<% end %>
<% end %>

如果您有机会在项目中更新 Espinita,我建议您这样做,因为他们更改了history_from_audits_for返回的哈希格式。

在较新的版本中,您将在"历史记录和还原"文档中看到类似以下内容:

model.history_from_audits_for([:name, :settings])
=> [{:changes=>{:name=>"Baz", :settings=>""}, :changed_at=>2015-05-03 15:33:58 -0700},
{:changes=>{:name=>"Arglebargle", :settings=>"IHOP"}, :changed_at=>2015-03-24 15:33:58 -0700},
{:changes=>{:name=>"Walrus"}, :changed_at=>2014-05-13 15:33:58 -0700}]

您的迭代将像以下那样简单:

<% @contract.contract_information.history_from_audits_for([:contract_title, :assigned_to, :deadline]).each do |audit| %>
<% audit[:changes].each do |attribute, value| %>
<tr>
<%= value %>
<%= audit[:changed_at].strftime("%m/%d/%Y") %>
</tr>
<% end %>
<% end %>

但是,如果您没有机会并且正在使用 Rails> 3.0.0,请考虑以下方法:

<% @contract.contract_information.history_from_audits_for([:contract_title, :assigned_to, :deadline]).each do |audit| %>
<% audit.except(:changed_at).each do |attribute, value| %>
<tr>
<%= value %>
<%= audit[:changed_at].strftime("%m/%d/%Y") %>
</tr>
<% end %>
<% end %>

使用Hash#except.

从审核中检索用户

<%= @contract.contract_information.audits.last.user.username %>

最新更新