当谈到 RoR 时,我非常乐观,并且无法确定我的问题是由我的模型关联中的问题引起的,还是我只是没有使用正确的语法来访问数据。
一个用户可以有很多预算。每个预算都由多个明细行组成。我认为budget_details 中不需要用户ID,因为它已在预算中捕获,因此可以通过三者之间的关系来推断(也许?!)
在budget_details 索引中,我希望能够包含用户名;我让它在“显示”视图中工作,但不是索引。
我确实使用了脚手架来设置这些,所以我知道那里有很多杂物,我只是想做一个例子,然后再转移到一个新项目来真正做到这一点。
实际错误是;
NoMethodError in Budget_details#index
Showing C:/Sites/example1/app/views/budget_details/index.html.erb where line #17 raised:
undefined method `name' for nil:NilClass
我不明白为什么这会失败,但 show 方法有效?是和范围有关吗?即显示是在单实例级别,而索引是在“全部”级别,所以它无法在用户中找到数据?
非常感谢任何帮助
楷模:
用户.rb
class User < ActiveRecord::Base
attr_accessible :email, :name
has_many :budgets
has_many :budget_details, :through => :budgets
预算.rb
class Budget < ActiveRecord::Base
attr_accessible :budget_name, :user_id
belongs_to :user
has_many :budget_details
Budget_details.rb
class BudgetDetail < ActiveRecord::Base
attr_accessible :amount, :amount_type, :budget_id, :itemname
belongs_to :budget
控制器 - budget_details_controller.rb
class BudgetDetailsController < ApplicationController
# GET /budget_details
# GET /budget_details.json
def index
@budget_details = BudgetDetail.all
@users = User.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @budget_details }
end
end
# GET /budget_details/1
# GET /budget_details/1.json
def show
@budget_detail = BudgetDetail.find(params[:id])
@user = User.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @budget_detail }
end
end
.....
show.html.erb <%= 通知 %>
<p>
<b>Username:</b>
<%= @user.name %>
</p>
<p>
<b>Budget:</b>
<%= @budget_detail.budget_id %>
</p>
<p>
<b>Itemname:</b>
<%= @budget_detail.itemname %>
</p>
<p>
<b>Amount:</b>
<%= @budget_detail.amount %>
</p>
<p>
<b>Amount type:</b>
<%= @budget_detail.amount_type %>
</p>
<%= link_to 'Edit', edit_budget_detail_path(@budget_detail) %> |
<%= link_to 'Back', budget_details_path %>
index.html.erb
<h1>Listing budget_details</h1>
<table>
<tr>
<th>Username</th>
<th>Itemname</th>
<th>Budget</th>
<th>Amount</th>
<th>Amount type</th>
<th></th>
<th></th>
<th></th>
</tr>
<% @budget_details.each do |budget_detail| %>
<tr>
<td><%= @user.name %></td>
<td><%= budget_detail.itemname %></td>
<td><%= budget_detail.budget_id %></td>
<td><%= budget_detail.amount %></td>
<td><%= budget_detail.amount_type %></td>
<td><%= link_to 'Show', budget_detail %></td>
<td><%= link_to 'Edit', edit_budget_detail_path(budget_detail) %></td>
<td><%= link_to 'Destroy', budget_detail, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</table>
<br />