2016-03-29 4 views
0

チュートリアルでは、このようなlink_toコードを知っています。list/index.html.erbにnode.nameをループする方法

lists/index.html.erb 

<ul class="lists box"> 
<% lists.each do |list| %> 
    <li> 
     <h2 class="list_title"> 
      <%= link_to list.title, list %> 
     </h2> 
     <p> 
      <%= truncate(list.content, length: 99) %> 
      <br> 
      <%= link_to list.node.name, list.node, class: "node" %> 
     </p> 
    </li> 
<% end %> 
</ul> 

及び2テーブル

create_table "lists", force: :cascade do |t| 
    t.string "title" 
    t.text  "content" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.integer "user_id" 
    t.integer "node_id" 
    end 

    create_table "nodes", force: :cascade do |t| 
    t.string "name" 
    t.string "summary" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

2モデル

class Node < ActiveRecord::Base 
    has_many :lists 
end 

class List < ActiveRecord::Base 
    belongs_to :node 
end 

コントローラ

class ListsController < ApplicationController 
    before_action :set_list, only: [:show, :edit, :update, :destroy] 

    def index 
    @lists = List.all.order(created_at: :desc).page(params[:page]).per(15) 
    end 

    def show 
    @list = List.find(params[:id]) 
    end 
. 
. 
. 
    private 
    def set_list 
     @list = List.find(params[:id]) 
    end 

    def list_params 
     params.require(:list).permit(:title, :content) 
    end 
end 

別のコントローラ

もOKの
class NodesController < ApplicationController 
    before_action :set_node, only: [:show, :edit, :update, :destroy, :node_list] 


    def index 
    @nodes = Node.all 
    end 

    def show 
    @node = Node.find(params[:id]) 
    end 
. 
. 
. 
. 

私のルート

Rails.application.routes.draw do 
    resources :lists, only: [:index, :show, :new] 
    devise_for :users 
    resources :users 
    resources :nodes, only: [:show] 

    root 'lists#index' 
end 

Iレール秒、私はエラー

NoMethodError in Lists#index 
Showing /Users/zhangxiaodong/workspace/listlist/app/views/lists/_list_list.html.erb where line #10 raised: 

undefined method `name' for nil:NilClass 

を持って、私は<%= link_to "list.node.name", list.node, class: "node" %> へのlink_to <%= link_to list.node.name, list.node, class: "node" %>を変更するとページがエラーが、ノード全くないとき。ページに名前リンクがありません。 私はAPI link_toを見ます[http://api.rubyonrails.org/]、仕事はありません、どのように私のノードをループすることができます。

+0

をあなたが表示されことができますあなたの 'routes.rb 'ファイルの内容? – dp7

+0

ありがとう、私は私の質問を編集する。 – dongdongxiao

答えて

1

lists/index.html.erbは、次のようになります。

<ul class="lists box"> 
    <% lists.each do |list| %> 
    <li> 
     <h2 class="list_title"> 
     <%= link_to list.title, list_path(list) %> 
     </h2> 
     <p> 
     <%= truncate(list.content, length: 99) %> 
     <br> 
     <%= link_to list.node.name, node_path(list.node), class: "node" if list.node.present? %> 
    </p> 
    </li> 
<% end %> 
</ul> 
+0

ありがとうございます。それは動作し、より多くのsimle。 – dongdongxiao

0

は、以下のことを試してみてください。

リスト/ index.html.erb

<ul class="lists box"> 
<% @lists.each do |list| %> 
    <li> 
     <h2 class="list_title"> 
      <%= link_to list.title, list_path(list) %> 
     </h2> 
     <p> 
      <%= truncate(list.content, length: 99) %> 
      <br> 
      <%= link_to list.node.name, node_path(list.node), class: "node" %> 
     </p> 
    </li> 
<% end %> 
</ul> 
1

あなたlistはどのnodeを持っていない可能性があるため。ただ、

<%= link_to list.node.name, list.node, class: "node" %> 

ビットこの

古いコードのようにコードを変更新しいコード

<% if list.node %> 
    <%= link_to list.node.name, list.node, class: "node" %> 
<% end %> 
+0

はい。あなたが正しいです。感謝万円。 – dongdongxiao

関連する問題