@pages-instance变量为nil:NillClass-在Rails中构建一个简单的CMS



经过几个小时的失败尝试,我决定在这里发布我的问题。我有一个页面控制器如下:

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>&nbsp;</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:NilClass的未定义方法"each"。应用程序中还有其他控制器工作正常,与页面控制器没有任何明显差异。

任何指点都会有很大帮助。

取消注释一条索引行:

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 %>即可。

首先用params检查您在控制器中得到的确切@subject是什么

  1. 我认为你应该照顾好@subject@page
  2. before_filter:find_subject取消对此方法的注释
  3. @pages = Page.where(:subject_id => @subject.id).sorted

plz检查所有条件

最新更新