铁轨上的红宝石CRUD。路由

时间:2015-03-12 20:09:56

标签: ruby-on-rails ruby-on-rails-3 crud

完成" Ruby on rails 3基本培训"我遇到了路线和网址的问题。我创建了一个带有'列表的sujects_controller。行动和展示'行动。在我的localhost中,当我进入时: localhost:3000.subjects / list,我收到错误,无法找到id = list' 但是,当我进入时: 本地主机:3000.subjects。我得到了输入第一个URL时应该出现的列表。此外,输入第二个URL后,我有显示,编辑和删除的链接。当我将鼠标悬停在链接"显示",在页面底部时,将来的输出将读取localhost.3000 / subject(3)。此链接有效。但是,根据我的教师教程,应该阅读localhost.3000 / subjects / show / 3。出于某种原因,我的链接和/或操作没有正常工作,我不确定为什么,因为我按照说明进行操作。

这是我的subjects_controller.rb文件:

    class SubjectsController < ApplicationController

def index
    list 
    render('list')
end

# def index
#   show
#   render('show')
# end

def list 
    @subjects = Subject.order("subjects.position ASC")
    #@subjects = Subject.all 
end 

def show 
    @subjects = Subject.find(params[:id])
end

def new
    @subjects = Subject.new
end

def create 
    @subject = Subject.new(params[:subject])

    if @subject.save 

    redirect_to(:action => 'list')
    else 

    render('new')
    end

end

    end 

这是我的list.html和show.html文件:

 <div class="subject list">
<h2>Subjects</h2>

<table class="listing" summary="Subject list">
    <tr class="header">
        <th>&nbsp;</th>
        <th>Subject</th>
        <th>Visible</th>
        <th>Pages</th>
        <th>Actions</th>
    </tr>
    <% @subjects.each do |subject| %>
    <tr>
        <td><%= subject.position %></td>
        <td><%= subject.name %></td>
        <td class="center"><%= subject.visible ? 'yes' : 'no' %></td>
        <td class="center"><%= subject.pages.size %></td>
        <td class="actions">
            <%= link_to("Show", {:action => 'show', :id => subject.id}, :class => 'action show') %>
            <%= link_to("Edit", '#', :class => 'action edit') %>
            <%= link_to("Delete", '#', :class => 'action delete') %>
        </td>
    </tr>
    <% end %>
</table>

Show.html

    <%= link_to("<< Back to list", {:action => 'list'}, :class => 'back-link') %>

    <div class="subject show">
        <h2>Show Subject</h2>

        <table summary="Subject detail view">
            <tr> 
                <th>Name</th>
                <td><%= @subject.name %></td>
            </tr>
            <tr>
                <th>Position</th>
                <td><%= @subject.position %></td>
            </tr>
            <tr>
                <th>Visible?</th>
                <td><%= @subject.visible ? 'true' : 'false' %></td>
            </tr>
            <tr>
                <th>Created</th>
                <td><%= @subject.created_at %></td>
            </tr>
            <tr>
                <th>Updated</th>
                <td><%= @subject.updated_at %></td>
            </tr>
        </table>

    </div>

我的config / routes.rb文件:

    Rails.application.routes.draw do
      root :to=>"demo#index"
      get 'demo/index'
      get 'demo/hello'
      get 'demo/other_hello'
      resources :subjects  
      get 'subjects/list' => 'subjects#list'
      get 'subjects/list' => 'subjects#show'
      get 'subjects/create' => 'subjects#create'

教师永远不会显示他的routes.rb文件,所以我刚开始使用gets来让我的行动起作用。资源:科目无法处理所有事情,所以我使用了GET。同样在我的subject_controller中我def:索引到渲染列表。如果我不这样做,那就没有任何作用。我显然对这一切都很陌生但是喜欢学习它并且感谢所有信息。我已经看过导游的导轨路线,但这对我没什么帮助。它更多的概念/理论为什么我的链接/行动不起作用,我很有兴趣听到。感谢您的任何信息!

3 个答案:

答案 0 :(得分:2)

在路线中指定

resources :subjects 它创建了七个动作(索引,新建,创建,创建,显示,编辑,更新,销毁)

当你致电localhost:3000/subjects时,它会询问路线去哪里。并且index操作被称为

/subjects subjects#index显示所有主题的列表

当你说localhost:3000/subjects/list时 它在id之后期望/subjects,因为有路由映射到

localhost:3000/subjects/5当你打电话给它时,它会在控制器中调用show方法,要求在数据库中输入id为5的记录 /subjects/:id subjects#show

如果要查看所有路径,请从控制台类型中查看 rake routes

如果你想定义额外的方法,如下面的list

get 'subjects/list' => 'subjects#list'

并从路径文件

中删除list的所有其他路由

还有更多选项可指定routes并了解这是您最好的朋友

http://guides.rubyonrails.org/routing.html

答案 1 :(得分:1)

问题是您的routes.rb文件。当您指定resources :subjects时,您要添加许多路线,其中一条路线为get 'subjects/:id' => 'subjects#show'

由于路线优先取决于您编写的顺序(从上到下),因此会覆盖您的get 'subjects/list' => 'subjects#list'行。

您还有许多其他冗余路由被覆盖。

  get 'subjects/list' => 'subjects#list'
  get 'subjects/list' => 'subjects#show'

主题#show将永远不会被调用,因为调用主题#list的路由将优先

答案 2 :(得分:1)

这是因为你第一次退出

      resources :subjects  

然后是其他路线。

在您的情况下,将路由添加到资源的最佳方法如下:

resources :subjects do
    collection do
        get :list, to: :show
    end
end

这将产生:

# rake routes
list_subjects GET    /subjects/list(.:format)     subjects#show
     subjects GET    /subjects(.:format)          subjects#index
              POST   /subjects(.:format)          subjects#create
  new_subject GET    /subjects/new(.:format)      subjects#new
 edit_subject GET    /subjects/:id/edit(.:format) subjects#edit
      subject GET    /subjects/:id(.:format)      subjects#show
              PATCH  /subjects/:id(.:format)      subjects#update
              PUT    /subjects/:id(.:format)      subjects#update
              DELETE /subjects/:id(.:format)      subjects#destroy