ruby rails 中的 CRUD。路由

CRUD in ruby on rails. Routing

完成 "Ruby on rails 3 essential training" 我的路线和 URL 遇到了问题。我创建了一个带有 'list' 操作和 'show' 操作的 sujects_controller。在我的本地主机中,当我输入时: localhost:3000.subjects/list,我收到错误消息,“找不到 id=list 的主题” 但是,当我输入时: localhost:3000.科目。我得到了输入第一个 URL 时应该出现的列表。此外,在输入第二个 URL 后,我有 link 用于显示、编辑和删除。当我将鼠标悬停在页面底部的 link "Show" 上时,未来的输出显示为 localhost.3000/subjects(3)。这 link 有效。但是,根据我的讲师教程,它应该是 localhost.3000/subjects/show/3。出于某种原因,我的 link 的 and/or 操作没有正常工作,我不确定为什么,因为我正在按照说明进行操作。

这是我的 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 来让我的动作起作用。资源 :subjects 无法处理所有事情,所以我使用了 GET。同样在我的 subjects_controller 我 def:index 渲染列表。如果我不这样做,那将毫无用处。我显然对所有这一切都不熟悉,但喜欢学习它,任何信息都会受到赞赏。我查看了指南中的 rails 路由,但这对我帮助不大。更多的是 concept/theory 为什么我的 links/actions 没有工作,我很想知道。感谢您提供任何信息!

当您在路线中指定时

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

问题出在您的 routes.rb 文件上。当您指定 resources :subjects 时,您将添加许多路由,其中​​之一是 get 'subjects/:id' => 'subjects#show'

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

您还有许多其他冗余路由正在那里被覆盖。

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

永远不会调用 subjects#show,因为调用 subjects#list 的路由优先

因为你先清除了

      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