我的应用程序在使用WEBrick的开发模式和生产中工作得很好。但在Unicorn中,它只能在开发模式下工作。只要我尝试编辑或更新一个类别,我就会得到一个无方法错误。任何帮助都很感激,谢谢!
错误:
Started GET "/symbols/smoke" for 127.0.0.1 at 2013-04-17 08:06:02 -0700
Processing by CategoriesController#show as JS
Parameters: {"id"=>"smoke"}
Rendered layouts/_tabs.html.erb (2.9ms)
Rendered categories/_meanings.html.haml (0.1ms)
Rendered categories/_categorylist.html.haml (2.5ms)
Rendered categories/_show-page.html.haml (13.5ms)
Rendered categories/show.js.erb (17.1ms)
Completed 500 Internal Server Error in 45ms
ActionView::Template::Error (undefined method `map' for nil:NilClass):
3: %li.nav-header a parent of:
4: - if @category.has_children?
5:
6: = list_categories(@children)
7: %li
8: = link_to new_category_path(:parent_id => @category, :view => "show"), :remote => true do
9: Add Child
app/helpers/categories_helper.rb:21:in `list_categories'
app/views/categories/_categorylist.html.haml:6:in `_app_views_categories__categorylist_html_haml__3404053025802473956_70332682747260'
app/views/categories/_show-page.html.haml:48:in `_app_views_categories__show_page_html_haml__1783905832676874426_70332684530780'
app/views/categories/show.js.erb:8:in `_app_views_categories_show_js_erb___3948970986596034947_70332684487680'
app/controllers/old_categories.rb:96:in `show'
类别控制器:
class CategoriesController < ApplicationController
helper :lego
helper :meanings
def index
@categories = Category.all
if params[:id]
@categories = Category.find(params[:id]) #if params[:id]
@categories = @categories.children.arrange(:order => 'name')
elsif params[:view] == "alpha"
@alphabet = Category.all.group_by{|c| c.name[0]}
@see_kids = false
@categories = @categories.sort(:name => "ASC") if !params[:letter]
@categories = @categories.where(name: eval("/^#{params[:letter]}/i")).sort(:name => "ASC") if params[:letter]
else
# @categories = Category.all
@categories = @categories.arrange(:order => 'name') #if params[:view] != "list"
end
respond_to do |format|
format.html # index.html.erb
format.js
format.json { render json: @categories }
end
end
def reorder
if Rails.env != "production" && !request.xhr?
flash[:info] = "Currently in #{Rails.env} mode."
end
@categories = Category.arrange(:order => 'name')
@new = Category.new(:parent_id => params[:parent_id])
@next = Category.count
respond_to do |format|
format.html # index.html.erb
format.js
format.json { render json: @categories }
end
end
def sort
params[:category].each do |id, attr|
thisCat = params[:category][id]
@category = Category.where(:_id => id).first
if thisCat.nil? || thisCat == 'null'
@category.parent_id = nil
@category.name_tag = @category.name
else
@category.parent_id = thisCat.to_s
@category.name_tag = "#{@category.name} <small>(#{@category.parent.name})</small>"
end
@category.save
end
end
def gallery
@categories = Category.arrange(:order => 'name')
@category = Category.find(params[:id])
@siblings = Category.siblings_of(params[:id])
respond_to do |format|
format.html # index.html.erb
format.js
format.json { render json: @category }
end
end
def show
@category = Category.find(params[:id])
@updater = User.find(@category.user) || nil
get_meanings(@category)
# @meanings = @category.meanings
respond_to do |format|
format.html # show.html.erb
format.js
format.json { render json: @category }
end
end
def search
@categories = Category.arrange(:order => 'name')
@category = Category.find(params[:id])
@meanings = @category.meanings
@meanings = @meanings.where(:beliefs => params[:beliefs]) if params[:beliefs]
@meanings = @meanings.where(:cultures => params[:cultures]) if params[:cultures]
@meanings = @meanings.where(:connotation => params[:connotation]) if params[:connotation]
@meanings = @meanings.where(:user => params[:user]) if params[:user]
end
def new
@new = Category.new(:parent_id => params[:parent_id])
@form_state = "new"
respond_to do |format|
format.html
format.js
format.json
end
end
def edit
@category = Category.find(params[:id])
respond_to do |format|
format.html
format.js
format.json
end
end
def create
@new = Category.new(params[:category])
@new.user = current_user
@new.name_tag = @new.name
@new.name_tag = "#{@new.name} <small>#{@new.parent.name}</small>" if @new.parent
respond_to do |format|
if @new.save
get_meanings(@new)
flash[:success] = "<h4><i class=icon-ok></i> '#{@new.name}' was successfully created.</h4>"
format.html { redirect_to @new }
if session[:form_type] == "show"
format.js {redirect_to @new }
else
format.js
end
format.json { render json: @categories, status: :created, location: @new }
else
format.html { render action: "new" }
format.js
format.json { render json: @new.errors, status: :unprocessable_entity }
end
end
end
def update
@categories = Category.arrange(:order => 'name')
@category = Category.find(params[:id])
@category.user = current_user
@category.name_tag = params[:category][:name]
# @siblings = Category.siblings_of(params[:id])
@category.name_tag = "#{params[:category][:name]} <small>#{@category.parent.name}</small>" if @category.parent
params[:view] = "reorder" if session[:form_type] == "reorder"
flash[:success] = "<h4><i class=icon-ok></i> #{@category.name} was successfully updated.</h4>"
get_meanings(@category)
respond_to do |format|
# get_meanings(@category)
# @similar = Category.where(:name => params[:category][:name])
if @category.update_attributes(params[:category])
format.html { redirect_to @category}
if session[:form_type] == "show"
format.js #{redirect_to @category }
else
format.js
end
format.json { head :no_content }
else
# get_meanings(@category)
flash[:error] = "<h4>Unable to update #{@category.name}</h4>"
format.html { render action: "edit", error: "Unable to update '#{@category.name}'", status: :unprocessable_entity }
format.json { render json: @category.errors, status: :unprocessable_entity }
format.js
end
end
end
def destroy
@category = Category.find(params[:id])
@category.destroy
flash[:alert] = "<h4><i class=icon-warning-sign></i> Warning. You have deleted the category '#{@category.name}'.</h4>".html_safe
respond_to do |format|
format.html { redirect_to categories_url }
format.json { head :no_content }
format.js
end
end
def has_sidebar?
self.has_children?
end
private
def get_meanings(category)
@categories = Category.arrange(:order => 'name')
@children = category.children.order_by(name: :asc) || []
@siblings = category.siblings.order_by(name: :asc) || []
@similar = Category.where(:name => category.name) || []
@meanings = category.meanings
@belief_list = []
@culture_list = []
@contributors = []
@connotations = []
for meaning in @meanings
for belief in meaning.beliefs
@belief_list << belief
end
for culture in meaning.cultures
@culture_list << culture
end
@connotations << meaning.connotation
@contributors << meaning.user
end
@beliefs = @belief_list.uniq
@cultures = @culture_list.uniq
@contributors = @contributors.uniq
@connotations = @connotations.uniq
end
end
显示页面:
.row
.span12
= breadcrumb(@category)
.row
%section.span10.pull-right
.row
%header.span10
.hero-unit.relative
.row
- if @category.image?
%figure.span3
= image_tag @category.image_url
.span5
%h1
= raw @category.name_tag
%p= @category.description
- if @similar.any?
- unless @similar.first.id == @category.id && @similar.last.id == @category.id
See also:
-@similar.each do |ref|
-unless ref.id == @category.id
= link_to raw(ref.name_tag), ref, :remote => true
-if @updater
.updated-by
Last updated by
= @updater.name
.row
.span10.no-history
#meaning-controls.row
.span2
= link_to [:new, @category, :meaning], :class => "btn", remote: true do
Add Meaning
%i.icon-plus
- if @meanings.any?
= render 'sorting-hat'
#meanings.no-history
-if @meanings
= render 'meanings'
%aside.span2.float-desktop
= render 'categorylist'
助手:
def list_categories(categories)
categories.map do |category|
content_tag(:li) do
link_to h(category.name), category, :remote => true
end
end.join.html_safe
end
<标题>更新:逐行搜索我的production.rb
文件,发现导致此错误的行是config.cache_classes = false
。只要我把它设置为true
,它就会正常保存。知道为什么这会导致错误吗?
暂时关闭config.cache_classes
。这个问题与我没有正确过期我的缓存有关。我会在专注于清理和重构我的代码后找出并解决它。
我将更新这个答案后,我开始再次关注缓存