【问题标题】:Show View Returning Error: undefined method `each'显示视图返回错误:未定义的方法“每个”
【发布时间】:2015-12-01 06:23:29
【问题描述】:

我在 Stack Overflow 上研究了这个主题,但我似乎仍然无法弄清楚我做错了什么。

我的 show.html 视图文件抛出此错误:

undefined method `each' for #<Advertisement:0x007fce42676a70>

当我在本地浏览器中点击个人广告时。

我的 show.html 查看代码:

<h1><%= @advertisement.title %></h1>

<%= link_to "Edit advertisement", edit_advertisement_path, class: 'btn btn-success' %>
<%= link_to "Delete advertisement", @advertisement, method: :delete, class: 'btn btn-danger', data: { confirm: 'Are you sure you want to delete this advertisement?' } %>

<div class="row">
  <div class="col-md-8">
    <p class="lead"><%= @advertisement.copy %></p>
    <% @advertisement.each do |advertisement| %>
    <div class="media">
      <div class="media-body">
        <h4 class="media-heading">
          <%= link_to advertisement.title, advertisement_path(@advertisement) %>
        </h4>
      </div>
    </div>
  <% end %>
  </div>
  <div class="col-md-4">
    <%= link_to "New Advertisement", new_advertisement_path(@advertisement), class: 'btn btn-success' %>
  </div>
</div>

我的广告控制器代码:

class AdvertisementsController < ApplicationController
  def index
    @advertisements = Advertisement.all
    # render('advertisements/index.html.erb')
  end

  def show
    # raise 'this is the show action'
    @advertisement = Advertisement.find(params[:id])
    # render 'advertisements/index.html.erb'
  end

  def edit
    @advertisement = Advertisement.find(params[:id])
  end

  def new
    @advertisement = Advertisement.new
  end

  def create
    @advertisement = Advertisement.new
    @advertisement.title = params[:advertisement][:title]
    @advertisement.copy = params[:advertisement][:copy]
    @advertisement.price = params[:advertisement][:price]

    if @advertisement.save
      flash[:notice] = "Advertisement was saved."
      redirect_to @advertisement
    else
      flash[:error] = "There was an error saving the advertisement. Please try again."
      render :new
    end
  end

  def update
    @advertisment = Advertisement.find(params[:id])
    @advertisment.title = params[:advertisement][:title]
    @advertisment.copy = params[:advertisement][:copy]
    @advertisment.price = params[:advertisement][:price]

    if @advertisement.save
      flash[:notice] = "Advertisement was updated."
      redirect_to @advertisement
    else
      flash[:error] = "Error saving advertisement. Please try again."
      render :new
    end
  end
end

通过研究,我相信我的问题是 advertisement 对象必须是一个数组。我需要更改哪些内容才能使显示视图正常工作?提前致谢!

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2


    【解决方案1】:

    问题及说明:

    undefined method `each' for #<Advertisement:0x007fce42676a70>
    

    错误消息为您提供提示。您可以在集合类型对象(例如数组或 ActiveRecordRelation 类型对象)上调用 .each。在这种情况下,您不能(也不应该)调用.each,因为没有什么可以循环或迭代。你这里只有一个对象:

    @advertisement = Advertisement.find(params[:id])
    

    对于您的索引视图,您在相应的控制器操作中有以下内容:

    @advertisements = Advertisement.all
    

    它为您提供Advertisement 对象的集合。在这种情况下,您可以这样做:@advertisements.each do .... 在您的视图中。

    但是,对于 show 操作,@advertisementAdvertisement 类的单个对象。因此,您不应该或不能尝试循环通过它。您只需在 show 视图中显示该 @advertisement 对象的相应属性/列值。

    解决办法:

    因此,将您的 show.html.erb 更改为此(不使用 .each),这应该可以解决您的问题:

    <div class="row">
      <div class="col-md-8">
        <p class="lead"><%= @advertisement.copy %></p>
            <div class="media">
              <div class="media-body">
                <h4 class="media-heading">
                  <%= link_to @advertisement.title, advertisement_path(@advertisement) %>
                </h4>
              </div>
            </div>
      </div>
      <div class="col-md-4">
        <%= link_to "New Advertisement", new_advertisement_path(@advertisement), class: 'btn btn-success' %>
      </div>
    </div>
    

    【讨论】:

    • 谢谢!当只显示一个广告时,我不知道为什么我试图在显示视图上循环播放。阅读您的回复后才有意义。感谢您的帮助!
    【解决方案2】:

    在您的 show 视图中试试这个:

    <h1><%= @advertisement.title %></h1>
    
    <%= link_to "Edit advertisement", edit_advertisement_path, class: 'btn btn-success' %>
    <%= link_to "Delete advertisement", @advertisement, method: :delete, class: 'btn btn-danger', data: { confirm: 'Are you sure you want to delete this advertisement?' } %>
    
    <div class="row">
      <div class="col-md-8">
        <p class="lead"><%= @advertisement.copy %></p>
    
        <div class="media">
          <div class="media-body">
            <h4 class="media-heading">
              <%= link_to @advertisement.title, advertisement_path(@advertisement) %>
            </h4>
          </div>
        </div>
    
      </div>
      <div class="col-md-4">
        <%= link_to "New Advertisement", new_advertisement_path, class: 'btn btn-success' %>
      </div>
    </div>
    

    【讨论】:

      【解决方案3】:

      要显示所有广告,您应该使用 index 方法,而要显示特定广告,您可以使用 show 方法,例如:-

      # Advertisement controller
      def index
          @advertisements = Advertisement.all
      end
      
      def show
          @advertisement = Advertisement.find(params[:id])
      end
      

      index.html.erb

      <div class="row">
          <div class="col-md-8">
              <% @advertisements.each do |advertisement| %>
                  <p class="lead"><%= advertisement.copy %></p>
                  <div class="media">
                      <div class="media-body">
                          <h4 class="media-heading">
                              <%= link_to advertisement.title, advertisement_path(advertisement) %>
                          </h4>
                      </div>
                  </div>
                  <%= link_to "Edit advertisement", edit_advertisement_path(advertisement), class: 'btn btn-success' %>
      <%= link_to "Delete advertisement", advertisement, method: :delete, class: 'btn btn-danger', data: { confirm: 'Are you sure you want to delete this advertisement?' } %>
              <% end %>
        </div>
        <div class="col-md-4">
            <%= link_to "New Advertisement", new_advertisement_path, class: 'btn btn-success' %>
        </div>
      </div>
      

      show.html.erb

      <div class="row">
          <div class="col-md-8">
              <p class="lead"><%= @advertisement.copy %></p>
              <p class="lead"><%= @advertisement.title %></p>
          </div>
      </div>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-18
        • 2013-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        相关资源
        最近更新 更多