【问题标题】:unable to display value in erb using ruby/sinatra无法使用 ruby​​/sinatra 在 erb 中显示值
【发布时间】:2015-12-06 12:15:47
【问题描述】:

我有两个模型类 - Admin 和 Bill。我可以使用 ActiveRecord 从数据库中获取它们,但是当我使用 erb 模板时,我无法显示账单信息(每个管理员可以有多个账单):

app.rb

  get '/admins/:id' do
        @admin = Admin.find_by(id:params[:id])
        @bills = Bill.find_by(user_id:params[:id])
        erb :adminDetails
  end

adminDetails.erb

<ul>
    <li>full name: <%=@admin.name %></li>
    <li>email: <%=@admin.email %></li>
        <% @bills.each do |bill| %>
        <li>bill title: <%=bill.title %></li>
        <li>bill body: <%=bill.body %></li>
         <% end %>
</ul>

我可以通过 irb 打印出账单信息,但是当我将其传递到 erb 模板时,出现以下异常:

WARN: tilt autoloading 'tilt/erb' in a non thread-safe way; explicit require 'tilt/erb' suggested.
2015-09-10 05:00:26 - NoMethodError - undefined method `each' for #<Bill id: 1, admin_id: 1, title: "test1", body: "this is test1">:
        /usr/local/rvm/gems/ruby-2.2.1/gems/activemodel-4.2.4/lib/active_model/attribute_methods.rb:433:in `method_missing'
        /opt/test/ruby/7/views/adminDetails.erb:11:in `block in singleton class'
        /opt/test/ruby/7/views/adminDetails.erb:-6:in `instance_eval'
        /opt/test/ruby/7/views/adminDetails.erb:-6:in `singleton class'
        /opt/test/ruby/7/views/adminDetails.erb:-8:in `__tilt_20667340'

比尔模型

class Bill < ActiveRecord::Base
        belongs_to :admin
end

我的设置是否有问题导致此问题?提前致谢

【问题讨论】:

    标签: ruby activerecord sinatra erb


    【解决方案1】:

    您试图通过一个记录进行迭代。 Bill.find_by(user_id:params[:id]) 只返回一个记录(第一个匹配),将您的代码修复为:

    @bills = Bill.where(user_id: params[:id])
    

    阅读wherefind_by 的文档

    【讨论】:

    • 谢谢。关于为什么 erb 甚至不会显示一个值的任何想法
    • each 用于遍历集合,显示一个值,使用变量和find_by 视图中没有each
    【解决方案2】:

    您的实例变量@bills 可能无法枚举。换句话说,@bills 可能不是实体Bill 的数组。

    你正在尝试迭代

    <Bill id: 1, admin_id: 1, title: "test1", body: "this is test1">
    

    甚至没有

    [#<Bill id: 1, admin_id: 1, title: "test1", body: "this is test1">]
    

    那是因为find_by 只返回基于条件的第一个匹配记录。

    【讨论】:

      【解决方案3】:

      为什么不从@admin 变量中提取账单? 你的控制器中不再需要@bills

        get '/admins/:id' do
              @admin = Admin.find_by(id:params[:id])
              erb :adminDetails
        end
      

      并将其用于您的模板:

        <% @admin.bills.each do |bill| %>
          <li>bill title: <%=bill.title %></li>
          <li>bill body: <%=bill.body %></li>
         <% end %>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-10
        • 2016-07-30
        • 2013-11-14
        • 2014-04-27
        • 2013-11-13
        • 2016-10-09
        • 2012-12-30
        • 1970-01-01
        相关资源
        最近更新 更多