Rails路由导致错误?

时间:2015-04-15 02:14:49

标签: ruby-on-rails routing crud

我是Ruby / Rails的新手,需要帮助完成我正在进行的任务。我应该以赞助商链接的形式向Bloccit(我正在上课的项目)添加原生广告。任何帮助将非常感激:)

需要做什么: 1)创建一个名为Advertisement的新模型。它应具有以下属性:title:string,copy:text,price:integer。

2)使用索引和显示动作为新广告模型生成控制器。控制器类和文件名是否应该具有单个(广告)或复数(广告)前缀?与用于先前生成的posts控制器类和文件的命名模式一致。

3)更新routes.rb以使用资源路由进行广告。

4)完成索引并在AdvertisementsController中显示操作。

5)更新广告索引并显示视图。

这就是我所拥有的:

首先,像这样创建模型

rails g model Advertisements title:string, copy:text, price:integer

然后,像这样创建控制器

rails g controller Advertisements index show

资源丰富的路由:

Rails.application.routes.draw do

  resources :advertisement
  resources :posts 

  get 'about' => 'welcome#about'

  root to: 'welcome#index'

end

索引和显示操作:

class AdvertisementController < ApplicationController
  def index
    @advertisements = Advertisement.all
  end

  def show
    @advertisements = Advertisement.find(params[:id])
  end
end

索引视图:

<h1>Advertisements</h1>
<% @advertisements.each do |advertisement| %>
<% end %>

显示视图:

<h1><%= @advertisements.title %></h1>
<p><%= @advertisements.copy %></p>
<p><%= @advertisements.price %></p>

当我去localhost:3000 /广告时,我看到一个空白页面,顶部有“广告”。当我转到localhost:3000 /广告/索引时,我看到一条错误消息:

找不到'id'= index

的广告
  def show
    @advertisements = Advertisement.find(params[:id]) #second line highlighted in red
  end
end

为什么我不能查看单个广告或看到所有广告的索引,比如我应该这样做?

4 个答案:

答案 0 :(得分:0)

当您看到顶部只有广告的页面时,您看到所有广告的索引,它不是重复&amp;打印任何因为不存在。

无法看到一个是因为路线默认为

localhost:3000/advertisements/:id

所以它试图查找一个广告,其中:id为“index”,很可能不存在。

尝试制作广告

答案 1 :(得分:0)

在创建您要查找的路由,控制器和视图时,您会发现rails是您的朋友。这是解决问题的最简单方法:

在终端cd进入你的rails程序,然后:

       rails g scaffold advertisement title:string, copy:text, price:integer
       press enter and then rake db:migrate.

当你去localhost:3000 /广告索引上的广告localhost:3000 / advertisements / [some:id]是特定广告的展示页面

另外在你的索引视图中你必须使用你正在创建的块变量,在这种情况下是广告来调用页面上你想要的属性:

      <%@advertisements.each do |advertisement|%>
      (Which is all the advertisement being looped)

      <%= advertisement.title %>
      <%= advertisement.copy %>
      <%= advertisement.price %>
      <% end%>

您将看到各个广告的各个元素的显示

答案 2 :(得分:0)

您似乎没有为索引视图中的每个广告输出任何内容,只是在广告中循环播放:

<h1>Advertisements</h1>
<% @advertisements.each do |advertisement| %>
<% end %>

在循环中,您需要为每个广告添加希望看到的标记和ERB。

您可以通过Rails控制台播种数据库或创建广告进行测试。正如阿尔弗雷德所暗示的那样,你应该能够在:

看到id = 1
localhost:3000/advertisements/1

小点,对于节目动作和视图,@ advertisement(singular)在语义上更有意义(你正在展示一个广告)。

答案 3 :(得分:0)

你忘了播种一些数据了。 在你的文件中:db / seeds.rb add:

 # Create Advertisements
10.times do 
  Advertisement.create!(
    title: Faker::Internet.domain_name,
    copy: Faker::Company.catch_phrase,
    price: 0
  )
end

然后将此输入到您的终端:rake db:seed

如果你没有这样做,rake db:migrate

现在应该可以了。