rails 上 ruby 中的 GET 错误。控制器和动作。增删改查

GET errors in ruby on rails. Controllers and actions. CRUD

我正在 lynda.com 完成 "Ruby on rails essential 3 training"。我正处于创建表单和实施 CRUD 的阶段。到目前为止,每当我尝试让 rails 启动一个动作时,它永远找不到定义。

为了解决这个问题,我在控制器中定义了操作,然后在我的 routes.rb 文件中创建了一个 GET。我的讲师不必执行此操作,他的服务器也可以正常启动。我觉得我做错了什么,因为我的 routes.rb 文件有很多 GET 命令。

请查看以下文件夹,如果您知道为什么我每次尝试新操作时都必须执行 GET,请告诉我。我听说在创建模型时应该同时创建一个 GET,但这并没有发生,我不确定我是否理解正确。我的主题控制器:

    class SubjectsController < ApplicationController

def index
    list 
    render('list')
end

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

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

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

def new
    @subject = Subject.new

end

def create 

end

结束

我的 new.html.erb 文件:

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

    <div class="subject new">
        <h2>Create Subject</h2>

        <%= form_for(:subject, :url => {:action => 'create'}) do |f| %>

            <table summary="Subject form fields">
                <tr>
            <th>Name</th>
            <td><%= f.text_field(:name) %></td>
        </tr>
        <tr>
            <th>Position</th>
            <td><%= f.text_field(:position) %></td>
        </tr>
        <tr>
            <th>Visible</th>
            <td><%= f.text_field(:visible) %></td>
        </tr>
    </table>

    <div class="form-buttons">
        <%= submit_tag("Create Subject") %>
    </div>
<% end %>

我的config/routes.rb

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

现在尝试创建测试对象时,Crud 的创建部分出现问题。这是我的 SubjectsController.rb

    class SubjectsController < ApplicationController

def index
    list 
    render('list')
end

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

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

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

def new
    @subject = Subject.new
end

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

    if @subject.save 

    redirect_to(:action => 'list')
    else 

    render('new')
    end

end

    end 

你的 config/routes.rb 应该是这样的:

root 'subjects#index'
resources :subjects
get 'subjects/list' => 'subjects#list'

是的,您不需要为 CRUD 操作指定 GET。您可以使用 Rails 资源路由。例如,您的 subjects 控制器操作可以在 routes.rb 中调用,如下所示:

resources: subjects

这将自动路由所有通用 CRUD 操作,并在您的控制器中查找它们。您可以通过在命令行中键入 rake routes 来查看是否 rails "picked up" 您的路由。您还可以通过传递 resources: subjects, only:[:destroy] 来限制您想要的操作数。这告诉 Rails 仅使用 subjects#destroy 操作。还有更多。我建议通读 this RailsGuide 以获取更多信息

通常情况下,您必须自己创建路由。它们不是用模型创建的。而且,它们与控制器的关系比与模型的关系更密切。

我建议看看官方 Rails 路由指南 here。通常像 subjects/create 这样的东西不是 GET 而是 POST 路由。您的讲师可能还使用了一条 resources :subjects 路线而不是多条 GET/POST/etc 路线。路线。

仅使用资源 dsl

@OhHendrie 的回答略有不同
root 'subjects#index'
resources :subjects do
  get 'list', on: :collection 
end