如何在 list/index.html.erb 上循环我的 node.name
How to loop my node.name on list/index.html.erb
在一个教程中,我知道一些像这样的 link_to 代码。
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
另一个控制器
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
当我 rails s 时,出现错误
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
<%= link_to list.node.name, list.node, class: "node" %>
至 <%= link_to "list.node.name", list.node, class: "node" %>
页面没有错误,但是node.name link 循环不在页面上。
我看 API link_to [http://api.rubyonrails.org/] ,没有工作,你能告诉我如何循环我的节点 .
尝试以下操作:
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" %>
</p>
</li>
<% end %>
</ul>
因为你的list
可能没有node
。稍微修改一下代码就可以了
旧代码
<%= link_to list.node.name, list.node, class: "node" %>
新密码
<% if list.node %>
<%= link_to list.node.name, list.node, class: "node" %>
<% end %>
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>
在一个教程中,我知道一些像这样的 link_to 代码。
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
另一个控制器
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
当我 rails s 时,出现错误
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
<%= link_to list.node.name, list.node, class: "node" %>
至 <%= link_to "list.node.name", list.node, class: "node" %>
页面没有错误,但是node.name link 循环不在页面上。
我看 API link_to [http://api.rubyonrails.org/] ,没有工作,你能告诉我如何循环我的节点 .
尝试以下操作:
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" %>
</p>
</li>
<% end %>
</ul>
因为你的list
可能没有node
。稍微修改一下代码就可以了
旧代码
<%= link_to list.node.name, list.node, class: "node" %>
新密码
<% if list.node %>
<%= link_to list.node.name, list.node, class: "node" %>
<% end %>
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>