无法使用 ruby/sinatra 在 erb 中显示值
unable to display value in erb using ruby/sinatra
我有两个模型 类 - 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
是不是我的设置有问题导致了这个问题?提前致谢
您试图对一条记录进行迭代。 Bill.find_by(user_id:params[:id])
returns 只有一条记录(第一个匹配),将您的代码修改为:
@bills = Bill.where(user_id: params[:id])
的文档
您的实例变量 @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
returns 只是第一个根据条件匹配的记录。
为什么不从 @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 %>
我有两个模型 类 - 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
是不是我的设置有问题导致了这个问题?提前致谢
您试图对一条记录进行迭代。 Bill.find_by(user_id:params[:id])
returns 只有一条记录(第一个匹配),将您的代码修改为:
@bills = Bill.where(user_id: params[:id])
的文档
您的实例变量 @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
returns 只是第一个根据条件匹配的记录。
为什么不从 @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 %>