Rails范围,帮助方法?

时间:2013-06-14 15:52:12

标签: ruby-on-rails ruby erb

我有三个型号。一个是Employee,一个是Item,一个是属于Employee和Items的Transaction。这是一个简单的应用程序,允许员工签入和签出项目 - “交易”有一个布尔列,用于签入/签出。

我要做的是在employee / show视图中显示Employee已检出的当前项目列表。这是我概述的一些粗略的代码,但我不确定它是否会起作用,并且我被告知不要在我的视图中使用很多嵌套条件。

    <% if @employee.transactions.exists? %>
        <h3>Currently Checked-OUT Items</h3>
        <table>
            <tr>
                <th>Item Asset Tag</th>
                <th>Item Description</th>
            </tr>
        <% @employee.transactions.each do |transaction| %>
            <% if item.transaction.last? && transaction.status == false %>
                <tr>
                    <td><% transaction.assettag %></td>
                    <td><% transaction.description %></td>
                </tr>
            <% else %>
            NO CHECKED OUT ITEMS
            <% end %>
        </table>
        <% end %>
    <% end %>   

基本上,我正在尝试:

  • 检查所有员工交易
  • 比较交易中涉及的项目,并查看它是否是项目<。li>的.last交易记录
  • 如果是,,如果它是假的,则它是当前的结帐。

对于Transaction模型中的作用域或辅助方法,这是一个更好的工作吗?我从来没用过,我是铁杆的新人。

2 个答案:

答案 0 :(得分:1)

你应该在这里做几件事。

首先 - 创建一个范围,为您提取最后一项交易。如果您只对最后一项交易感兴趣,那么进行项目交易没有意义,对吗?

其次,使用部分。在这个例子中很难说明我将如何重构代码以使用它们(有些事情在这里没有意义,例如,项目变量来自哪里?)

范围示例(采取上次交易)

@item.transactions.order('created_at DESC').first

您还可以为checkin / checkout添加范围

class Transaction
    scope :checkin, -> { where(status: true) }
    scope :checkout, -> { where(status: false) }
end

答案 1 :(得分:0)

首先,你走在正确的轨道上。当由于广泛的嵌入式ruby条件等而使视图变得丑陋且难以阅读时,请考虑将逻辑转移到帮助器中。

如果你有一个典型的rails应用程序,你已经有app / helpers / application_helper.rb

所以你可以在那个文件中创建一个帮助器

def make_employee_list(employee)

   if employee.transactions.exists?
     content_tag(:div) do
       content_tag(:h3, "Currently Checked-OUT Items")
       content_tag(:table) do
         employee.transactions.each do |transaction|
           #  you get the idea
         end
       end
     end
   end
end

然后在你看来你可以这样做:

<%= make_employee_list(@employee) %>