0

Ruby on Rails プロジェクトにオブジェクト (ツール) のデータベースがあります。「rails dbconsole」を使用すると、

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

nil オブジェクトに対して if ステートメントを追加するようにコードを変更すると、ページは機能します (ツールは表示されません)。

<% 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
4

2 に答える 2

2

@nbarraille が提案したように、すべて@toolsのアクションに対して before_filter をロードするのは悪い考えです。ツールの完全なセット (および など) が絶対に必要ない多くの (おそらくほとんどの) アクションがあるためです。この行はデータベースにヒットするため、使用する回数を最小限に抑える必要があります。createdestroy@tools = Tool.all

ここにあるケースでは、showこれを機能させるためにアクションを変更するだけで済みます。

def show
  @tools = Tool.all
end

ただし、通常、showアクションは単一のリソース (ツール) を表示するためのものであり、リソースのリスト全体を表示するためのものではないことに注意してください (これは通常indexアクションで行われます)。普段のやり方からずれているように見えますが、何か理由はありますか?

于 2012-09-20T00:29:57.000 に答える
1

ビューから変数にアクセスできるようにする@toolsには、次のようにコントローラーで変数を宣言する必要があります。

@tools = Tool.all

1 つのページからのみアクセスできるようにする場合は、対応するメソッドで宣言するだけです。

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

これを行う方法は次のとおりです。

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
于 2012-09-20T00:09:00.947 に答える