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
我正在 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