无法使用ruby/sinatra显示erb中的值



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

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'
<<p> 比尔模型/strong>
class Bill < ActiveRecord::Base
        belongs_to :admin
end

是我的设置有问题导致这个问题吗?提前感谢

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

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

阅读wherefind_by的文档

您的实例变量@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只返回基于条件的第一个匹配记录。

为什么不从@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 %>

最新更新