2012-09-20 53 views
0

我的Ruby on Rails項目中有一個對象(工具)數據庫。當我使用「rails dbconsole」和Rails認爲儘管控制檯顯示數據庫,類仍爲零

select * from tools; 

它返回工具對象的整個列表。但是當我嘗試查看下面的頁面時,它給了我一個錯誤。

頁:

<!DOCTYPE html> 
<html lang="en"> 


<%= stylesheet_link_tag "tools", :media => "all" %> 
<body> 
<%= @tools.each do |tool| %> 
<%= link_to(tool(image_tag.image_url)) %> 
<% end %> 

</body> 
</html> 

錯誤:

undefined method `each' for nil:NilClass 

當我修改代碼,添加對是否爲零對象的說法,頁作品(不顯示任何工具)。

<% if @tools.nil? %> 
<% else %> 
    <%= @tools.each do |tool| %> 
    <%= link_to(tool(image_tag.image_url)) %> 
    <% end %> 
<% end %> 

因此,似乎@tools沒有任何值,但是當我在dbconsole中查看它時,那裏有工具。我無法弄清楚這一點,而且我花了幾天的時間搜索答案,所以任何和所有的想法都會受到歡迎!

編輯:添加tools_controller.rb

class ToolsController < ApplicationController 
before_filter :check_authentication 
def check_authentication 
    unless session[:user_id] 
    session[:intended_action] = action_name 
    session[:intended_controller] = controller_name 
    redirect_to new_session_url 
    end 
end 

    def new 
    @tool = Tool.new 
    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render :json => @tool } 
    end 
    end 

def show 
end 

def index 
    @tools = Tool.all 
    end 

    # GET /tools/1/edit 
    def edit 
    @tool = Tool.find(params[:id]) 
    end 

    # POST /tools 
    # POST /tools.json 
def create 
    @tool = Tool.new(params[:tool]) 
    respond_to do |format| 
     if @tool.save 
     format.html { redirect_to @tool, :notice => 'tool was successfully created.' } 
     format.json { render :json => @tool, :status => :created, :location => @tool } 
     else 
     format.html { render :action => "new" } 
     format.json { render :json => @tool.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 
end 
+0

請包含您的控制器代碼,這可能是問題的根源。 –

+0

我已經添加了控制器代碼。謝謝! – camdroid

+0

「但是,當我嘗試查看以下頁面時<< - 您在這裏討論哪個視圖?如果是'index'視圖,那麼這應該起作用,因爲你正確地分配了'@tools = Tool.all'。如果是任何其他視圖,那麼它將不起作用。 –

回答

1

爲了使@tools變量是從您的視圖訪問,你需要聲明它在你的控制器,就像這樣:

@tools = Tool.all 

如果你希望它只能從一個頁面訪問,只需在相應的方法中聲明它。

下面是一個例子,假設你想提供的變量爲您home/index頁:

class HomeController < ApplicationController 

    def index 
    @tools = Tool.all 

    respond_to do |format| 
     format.html # index.html.erb 
    end 
    end 
end 

如果你希望它是在所有網頁訪問,則可以在該before_filter方法聲明它你的ApplicationController

這裏是如何做到這一點:在行動@nbarraille曾建議是一個壞主意一個的before_filter

class ApplicationController < ActionController::Base 
    protect_from_forgery 
    before_filter :load_variables 

    # Load variables to be used everywhere 
    def load_variables 
    @tools = Tool.all 
    end 
end 
+0

太棒了,看起來好像照顧了這個問題,謝謝!但隨後其他錯誤彈出: ' 顯示G:/1000Tools/app/views/tools/show.html.erb其中行#9提出: 錯誤的參數數目(0 1) 提取的源(約第9行): 6: 7: 8:<%= @ tools.each do | tool | %> 9:<(%)=的link_to(工具(image_tag.image_url),工具)%> 10:<% end %> 11: 12: ' (對不起,仍試圖找出徵求意見的風格。) – camdroid

+1

這意味着在第9行:('<%= link_to(tool(image_tag.image_url),tool)%>'),你用0參數調用一個用1定義的ruby方法。請看看這個指南:'http:// guides.rubyonrails.org/routing.html' – nbarraille

+0

太棒了,修正了它!謝謝你的幫助! – camdroid

2

加載@tools,因爲有很多(可能是大部分)的行動在那裏你會絕對不需要全套工具(例如createdestroy)。行@tools = Tool.all命中你的數據庫,所以你應該儘量減少你使用它的次數。

對於你在這裏的話,你只需要改變你的show行動來得到這個工作:

def show 
    @tools = Tool.all 
end 

但是請注意,正常的show作用是用於顯示資源(工具),而不是整個資源列表(通常在index操作中完成)。看起來你正在偏離正常的做事方式,有什麼特別的原因嗎?

+0

是的,有一個非常特別的原因:我是一個noob,不知道我在做什麼。 :D但我現在將它改爲索引,我知道這一點。 – camdroid

+0

另外,如何讓代碼框顯示一個單詞? – camdroid

+0

在反引號(')中圍繞文本。關於動作/視圖,通過rails文檔並查看約定是個好主意。 Rails是關於約定的,如果你偏離它們,你應該確定它有一個很好的理由。 –

相關問題