如何在Rails中为控制器正确创建第二个视图?

时间:2013-10-01 17:38:40

标签: ruby-on-rails

我是Rails的新手,并创建了第二个控制器来显示项目列表,而不提供编辑和销毁选项。 (它的意思是前端)我现在正在尝试为该特定列表创建一个显示视图,但我不确定采取了哪些步骤。创建了第二个视图文件后,我似乎无法访问模型中的信息,接收到未定义的变量错误。我能够在控制器的主索引视图中访问它们,所以我希望路由中的某些东西或者我必须添加的控制器本身。

提前感谢您的帮助。

2013年10月1日更新16:15PST

第二个名为show.html.erb的视图,只包含以下代码以查看它是否会提取数据:

<p><%= plant.botanical_name %></p>

第一个名为index.html.erb的视图包含此视图,它正确地提取变量:

<h1>Plant Display</h1>

<% @plants.each do |plant| %>

<div class="listingItem">
    <div class="showThumbnail">
        <%= link_to display_show_path do %>
            <%= image_tag plant.photo.url(:medium) %>
        <% end %>
    </div>
    <div class="listingItemInformation">
            <p><%= plant.botanical_name %></p>
            <p><%= plant.family %></p>
            <p><%= plant.common_name %></p>
    </div>

</div>
<div class="clear">
</div>
<% end %>

控制器就是这样:

class DisplayController < ApplicationController
  def index
    @plants = Plant.order(:botanical_name)
  end
end

此外,就版本而言:Rails 4.0.0.rc1和Ruby 1.9.3p392

1 个答案:

答案 0 :(得分:0)

plant视图中的index变量实际上是迭代块的参数。当你这样写:

   

它遍历@plants中的所有植物,并在每次迭代plant上分配给植物。 @plants本身在index控制器方法中定义。

您的show视图不起作用,因为它使用plant但未在任何地方定义。由于您只想显示单个工厂,因此您要做的是在@plant控制器方法中创建show变量,并在代码中使用它而不是plant。所以你的控制器应该看起来像这样(没有测试它):

class DisplayController < ApplicationController
  def index
    @plants = Plant.order(:botanical_name)
  end

  def show
    @plant = Plant.find(params[:id])
  end
end

和您的观点:

<p><%= @plant.botanical_name %></p>

此外,在index视图中,您需要更改

<%= link_to display_show_path do %>

<%= link_to display_show_path(plant) do %>

因此它将链接到当前迭代的工厂。