未定义的方法`each'代表nil:NilClass用于show动作

时间:2017-02-02 04:56:55

标签: ruby-on-rails ruby

我似乎无法找到问题所在。在我的场地show模板中,我想显示场地名称,在此之下,我列出了数据库中的所有场地

<%= venu.name %>
<% @venus.each do |v| %>

我收到@venusnil的错误...但它在我的控制器中定义:

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路线。

我不确定是什么导致了这个问题。

5 个答案:

答案 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,但由于您首先渲染它会引发错误。最后渲染。