经过几个小时的尝试失败后,我在这里提出问题。我有一个页面控制器如下:
class PagesController < ApplicationController
layout "admin"
# before_action :confirm_logged_in
# before_action :find_subject
def index
# @pages = Page.where(:subject_id => @subject.id).sorted
# @pages = @subject.pages.sorted
end
def show
@page = Page.find(params[:id])
end
def new
@page = Page.new({:name => "Default"})
@subjects = Subject.order('position ASC')
@page_count = Page.count + 1
end
def create
@page = Page.new(page_params)
if @page.save
flash[:notice] = "Page created successfully."
redirect_to(:action => 'index')
else
@subjects = Subject.order('position ASC')
@page_count = Page.count + 1
render('new')
end
end
def edit
@page = Page.find(params[:id])
@subjects = Subject.order('position ASC')
@page_count = Page.count
end
def update
@page = Page.find(params[:id])
if @page.update_attributes(page_params)
flash[:notice] = "Page updated successfully."
redirect_to(:action => 'show', :id => @page.id)
else
@subjects = Subject.order('position ASC')
@page_count = Page.count
render('edit')
end
end
def delete
@page = Page.find(params[:id]).destroy
flash[:notice] = "Page destroyed successfully."
redirect_to(:action => 'index')
end
private
def page_params
# same as using "params[:subject]", except that it:
# - raises an error if :subject is not present
# - allows listed attributes to be mass-assigned
params.require(:page).permit(:subject_id, :name, :permalink, :position, :visible)
end
def find_subject
if params[:subject_id]
@subject = Subject.find(params[:subject_id])
end
end
end
我的索引视图如下:
<% @page_title = "Pages" %>
<div class="pages index">
<h2>Pages</h2>
<div class="pull-right">
<%= link_to("Add New Page", {:action => 'new'}, :class => 'btn btn-success') %>
</div>
<br><br>
<table class="table table-striped table-bordered listing" summary="Page list">
<tr class="header">
<th> </th>
<th>Subject</th>
<th>Page</th>
<th>Permalink</th>
<th>Visible</th>
<th>Sections</th>
<th>Actions</th>
</tr>
<% @pages.each do |page| %>
<tr>
<td><%= page.position %></td>
<td><%= page.subject.name if page.subject %></td>
<td><%= page.name %></td>
<td><%= page.permalink %></td>
<td class="center"><%= status_tag(page.visible) %></td>
<td class="center"><%= page.sections.size %></td>
<td class="actions">
<%= link_to("Show", {:action => 'show', :id => page.id, :subject_id => @subject.id}, :class => 'btn btn-primary btn-xs') %>
<%= link_to("Edit", {:action => 'edit', :id => page.id, :subject_id => @subject.id}, :class => 'btn btn-warning btn-xs') %>
<%= link_to("Delete", {:action => 'delete', :id => page.id, :subject_id => @subject.id}, :class => 'btn btn-danger btn-xs') %>
</td>
</tr>
<% end %>
</table>
</div>
我正在为nil获取未定义的方法'each':当我访问页面索引时NilClass。应用程序中还有其他控制器正常工作,与页面控制器没有任何明显区别。
任何指针都会有很大的帮助。
答案 0 :(得分:3)
取消注释您的一条索引行:
def index
@pages = Page.where(:subject_id => @subject.id).sorted
# @pages = @subject.pages.sorted
end
或强>
def index
# @pages = Page.where(:subject_id => @subject.id).sorted
@pages = @subject.pages.sorted
end
<强>更新强>
我对您的应用了解不多,但您需要在使用之前定义@subject
,并且因为您的before_action :find_subject
已被注释掉,您应该尝试取消注释:
# before_action :find_subject
到
before_action :find_subject
同时强>
在视图中定义实例是不好的做法。这个<% @page_title = "Pages" %>
属于控制器索引,如下所示:
def index
@page_title = "Pages"
...
end
然后在您的视图中调用<%= @page_title %>
。
答案 1 :(得分:2)
首先用params检查你在控制器中得到了什么@subject
@subject
和@page
:find_subject
取消对此方法的评论@pages = Page.where(:subject_id => @subject.id).sorted
检查所有条件