【问题标题】:Rails Scope, Helper Method?Rails 范围,辅助方法?
【发布时间】:2013-06-15 02:13:38
【问题描述】:

我有三个模型。一个是员工,一个是项目,一个是同时属于员工和项目的事务。这是一个简单的应用程序,允许员工签入和签出项目 - “交易”有一个用于签入/签出的布尔列。

我要做的是在员工/显示视图中显示员工已签出的当前项目列表。这是我草拟的一些粗略代码,但我不确定它是否会起作用,而且我被告知无论如何不要在我的视图中使用大量嵌套条件。

    <% 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 %>   

基本上,我正在尝试:

  • 检查所有员工交易
  • 比较交易中涉及的物品,看看它是否是物品的.last交易记录
  • 如果是,如果它是假的,那么它就是当前结帐。

对于 Transaction 模型中的范围或辅助方法来说,这是一个更好的工作吗?我也从来没有用过,我对rails真的很陌生。

【问题讨论】:

    标签: ruby-on-rails ruby erb


    【解决方案1】:

    你应该在这里做几件事。

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

    其次,使用部分。在这个例子中,很难展示我将如何重构代码来使用它们(有些东西在这里没有意义,例如 item 变量来自哪里?)

    范围示例(取最后一笔交易)

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

    您也可以添加签入/签出范围

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

    【讨论】:

    • 专业提示也是为了避免模糊命名的状态列。要么将其重命名为 ex。 in_stock 或使用动词状态(签入,签出),也许是aasm?
    • 我以前从未使用过作用域——第一个作用域的作用域会是:作用域:last_transaction,@item.transaction.order('created_at DESC').first
    • 我建议你阅读 Rails 指南部分 guides.rubyonrails.org/active_record_querying.html#scopes(以及一般的 Rails 指南,总是要学习的东西!)
    【解决方案2】:

    首先,您走在正确的轨道上。当视图由于大量嵌入的 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) %>
    

    【讨论】:

    • 如何解决复杂视图的问题?相反,它使生成 viw 成为一场噩梦(并且比常规 erb 花费更长的时间)
    • 我也有同样的想法——我承认你比我更有经验——但我很难实施你的解决方案。有没有更简单的方法 - 可能只是一个不呈现 html 的范围或辅助方法?
    • 抱歉,是的,正如我在回答中所说,content_tag 助手是更传统的方法。我只是复制并粘贴了我的一个助手并将其破解。我将添加一个更简单的示例。
    猜你喜欢
    • 2012-12-30
    • 2016-07-22
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 2012-06-28
    相关资源
    最近更新 更多