我似乎无法找到问题所在。在我的场地show
模板中,我想显示场地名称,在此之下,我列出了数据库中的所有场地
<%= venu.name %>
<% @venus.each do |v| %>
我收到@venus
为nil
的错误...但它在我的控制器中定义:
undefined method 'each' for nil:NilClass
venues_controller.rb
class VenuesController < ApplicationController
before_action :find_venue, only: [:show, :edit, :update, :destroy]
def index
@venus = Venue.all
end
def show
render :layout => nil
@venus = Venue.all
end
def new
@venu = Venue.new
end
def create
@venu = Venue.new(venue_params)
@venu.save
end
def edit
end
def update
end
def destroy
end
private
def venue_params
params.require(:venue).permit(:name, :phone, :address, :description, :type)
end
def find_venue
@venu = Venue.find(params[:id])
end
end
我的resources :venues
中有一条routes.rb
路线。
我不确定是什么导致了这个问题。
答案 0 :(得分:1)
从render :layout => nil
操作中删除show
。
在您看来,您需要使用实例变量@venu
而不是venu
<%= @venu.name %>
答案 1 :(得分:1)
在show
方法中,您应该在结尾处进行渲染
def show
@venus = Venue.all
render :layout => nil
end
答案 2 :(得分:1)
我想知道你为什么要为行动dropdw
show
(通过@venu
find_venue
)&amp; before_filter
通过行动本身。
最佳做法是从行动@venus
中删除此行,因为show
操作通常用于显示列表中某个元素的详细信息。
show
并使用@venus = Venue.all
设置的@venu
代替。
但是,如果您确实要同时保留两者,请在before_filter
操作
show
另外,将@venus = Venue.all
render :layout => nil
更改为venu
中的@venu
,如果您愿意更正实例变量中的拼写错误show.html.erb
=&gt; @venu
:)(可能发生在我们任何人身上)
答案 3 :(得分:1)
通常在index
方法中,它应显示所有venus
,在show
方法中,它会显示每个venue
的详细视图。
尝试设置如下内容:
def index
@venus = Venue.all
end
def show
render :layout => nil
@venue = Venue.find(params[:id])
end
现在在show.html.erb
你应该可以使用
@venue.name
在您的index.html.erb
中,您可以像这样迭代金星:
<% @venus.each do |v| %>
<%= link_to v do %>
<%= v.name %>
<% end %>
<% end %>
答案 4 :(得分:1)
以上答案是正确的。您可以在展示视图中使用@venus = Venue.all
,但由于您首先渲染它会引发错误。最后渲染。