当我从未显式调用实例变量时,为什么我的实例变量会显示在视图上?

时间:2019-02-12 01:36:33

标签: ruby-on-rails ruby view

我正在使用Rails进行编码,并且已经从rails g modelrails g controller创建了一个应用程序。我已经成功创建了索引,显示,创建和新操作,并且在运行服务器并检查完成后项目我有一个问题,我的@coupons的实例变量包含在视图索引页面中,该实例变量包含创建的优惠券的数组。我没有明确称呼它,也没有显示任何东西。以下是我的index.html.erbCouponController的代码。

views / index.html.erb

<h1> List of Stores with Coupons</h1>

<div>
<%= @coupons.each do |coupon| %>
  <h2><%= link_to coupon.store, coupon_path(coupon) %></h2>
<% end %>
</div>

<%= form_tag new_coupon_path, :method => :get do %>
  <%= submit_tag "Create New Coupon" %>
<% end %>

CouponController

class CouponsController < ApplicationController
  def index
    @coupons = Coupon.all
  end

  def new
  end

  def create
    @coupon = Coupon.create(coupon_code: params[:coupon][:coupon_code], store: params[:coupon][:store])

    redirect_to coupon_path(@coupon)
  end

  def show
    @coupon = Coupon.find(params[:id])
  end
end

请注意,我还从rails g controller Image of said issue

创建控制器时删除了CSS。

2 个答案:

答案 0 :(得分:4)

<%= @coupons.each do |coupon| %>

应该是

<% @coupons.each do |coupon| %>

<%=使@coupons在视图上输出。

答案 1 :(得分:2)

问题是您使用的是<%= %>,而不是<% %>

<%= %>输出表达式的值。 #each的返回值是一个数组。

<% @coupons.each do |coupon| %>
  <h2><%= link_to coupon.store, coupon_path(coupon) %></h2>
<% end %>

这可能有些令人困惑,但是请记住,您正在使用#each来产生副作用-而不是返回值。对于每次迭代,<h2><%= link_to coupon.store, coupon_path(coupon) %></h2>将添加到字符串缓冲区(呈现的视图)。