2016-03-29 3 views
0

Sur un tutoriel, je connais un code link_to comme celui-ci.Comment boucler mon node.name sur list/index.html.erb

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> 

et 2 tables

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 modèles

class Node < ActiveRecord::Base 
    has_many :lists 
end 

class List < ActiveRecord::Base 
    belongs_to :node 
end 

contrôleurs est également OK

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 

un autre contrôleur

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 
. 
. 
. 
. 

mes itinéraires

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

    root 'lists#index' 
end 

Quand je rails s, je suis arrivé erreur

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 

et quand je change la link_to <%= link_to list.node.name, list.node, class: "node" %>-<%= link_to "list.node.name", list.node, class: "node" %> La page est pas d'erreur, mais le nœud. boucle de lien de nom pas sur la page. Je regarde API link_to [http://api.rubyonrails.org/], pas de travail, pouvez-vous me dire comment boucle mon noeud.

+0

Pouvez-vous montrer vos 'routes.rb 'contenu du fichier? – dp7

+0

merci, je modifie ma question. – dongdongxiao

Répondre

1

lists/index.html.erb devrait ressembler à ce qui suit:

<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

Merci beaucoup. Ca marche et plus encore. – dongdongxiao

0

Effectuez les opérations suivantes:

listes/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

Parce que votre list ne peut avoir aucun node. Il suffit de modifier le code un peu comme ce

ancien code

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

Nouveau code

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

Oui. tu as raison. Merci un million. – dongdongxiao