将 Rails 中的资源路由转换为非资源路由
Convert resource routes in Rails to non-resource routes
我已经使用非数据库支持的模型实现了这个简单的表单。而且我能够执行验证并在其上显示表单字段。但是我已经使用资源实现了这个。现在我想了解如何添加更多操作,除了 CRUD 之外,并为它们定义路由。或者,如果我想停止使用 resources
,并明确定义操作路径。我该如何处理?
我的文件:
控制器:new_forms_controller.rb
class NewFormsController < ApplicationController
def new
@form = NewForm.new
flash[:notice] = nil
end
def index
end
def create
@form = NewForm.new(params[:new_form])
if @form.valid?
flash[:notice] = "Successfully created recommendation."
render :action => 'show'
else
render :action => 'new'
end
end
def show
end
end
型号:new_form.rb
class NewForm
include ActiveModel::Validations
include ActiveModel::Conversion
include ActiveModel::Naming
attr_accessor :title, :article, :content, :author
validates :title, :article, :content, :author, :presence => true
validates :title, :article => {:minimum => 5 }
def initialize(attributes = {})
attributes.each do |name, value|
send("#{name}=", value)
end
end
def persisted?
false
end
end
路线:route.rb
TestBranch::Application.routes.draw do
resources :new_forms
root :to => "new_forms#new"
end
新视图
<%= content_for :title, "New Form" %>
<% if flash[:notice] %>
<p><%= flash[:notice]%></p>
<% end %>
<%= form_for @form do |f| %>
<% if @form.errors.any? %>
<div id="error_explanation">
<h2>
<%= pluralize(@form.errors.count, "error") %> prohibited
this article from being saved:
</h2>
<ul>
<% @form.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<p>
<%= f.label :titleID %> <br/>
<%= f.text_field :titleID %><br/>
</p>
<p>
<%= f.label :articleID %><br/>
<%= f.text_field :articleID %><br/>
</p>
<p>
<%= f.label :content %><br/>
<%= f.text_field :content %><br/>
</p>
<p>
<%= f.label :author %><br/>
<%= f.text_field :author %><br/>
</p>
<p><%= f.submit "Submit" %></p>
<% end %>
您需要向您的控制器添加所需的操作,并向 route.rb
添加相应的路由。这是一个例子:
在route.rb
中:
TestBranch::Application.routes.draw do
resources :new_forms do
collection do
get :new_action1 # will produce /new_forms/new_action1
post :new_action2 # will produce /new_forms/new_action2
delete :new_action3 # will produce /new_forms/new_action3
end
member do
get :new_action4 # will produce /new_forms/:id/new_action4
put :new_action5 # will produce /new_forms/:id/new_action5
delete :new_action6 # will produce /new_forms/:id/new_action6
end
end
root :to => "new_forms#new"
end
控制器:new_forms_controller.rb
class NewFormsController < ApplicationController
...
def new_action1
...
end
def new_action2
...
end
def new_action3
...
end
def new_action4
...
end
def new_action5
...
end
def new_action6
...
end
...
end
resources
基本上可以节省您编写大量代码,并让您能够自己编写代码。因为,你已经要求明确定义你自己的路径,你可以通过以下方式定义它们:
在routes.rb,
get '/users' => 'users#index'
get '/users/:id' => 'users#show'
get '/users/new' => 'users#new'
post '/users' => 'users#create'
get '/users/:id/edit' => 'users#edit'
put '/users' => 'users#update'
delete '/users' => 'users#destroy'
这几行基本等同于resources :users
。此外,您还询问了如何添加更多操作,并为它们定义相应的路由:首先,您可以看看我为 resources :users
写的内容,其次,您可以查看 guides for routes.
您可以使用 match
手动定义路线
match 'new_form' => 'new_form#index', :via => :get
这会将对 /new_form
的 get
请求与 new_form
控制器
中的 index
操作相匹配
向资源添加额外的路由非常简单:
自定义 resources
生成的路由非常简单:
resources :users do
collection do
get :search
end
member do
get :info
end
end
这会给我们:
GET /users/search => users#search
GET /users/:id/info => users#info
然而,在添加任何更多路由之前,请问问自己,您要实现的目标是否实际上与现有的 CRUD 操作之一不匹配 - 十有八九是匹配的。
我已经使用非数据库支持的模型实现了这个简单的表单。而且我能够执行验证并在其上显示表单字段。但是我已经使用资源实现了这个。现在我想了解如何添加更多操作,除了 CRUD 之外,并为它们定义路由。或者,如果我想停止使用 resources
,并明确定义操作路径。我该如何处理?
我的文件:
控制器:new_forms_controller.rb
class NewFormsController < ApplicationController
def new
@form = NewForm.new
flash[:notice] = nil
end
def index
end
def create
@form = NewForm.new(params[:new_form])
if @form.valid?
flash[:notice] = "Successfully created recommendation."
render :action => 'show'
else
render :action => 'new'
end
end
def show
end
end
型号:new_form.rb
class NewForm
include ActiveModel::Validations
include ActiveModel::Conversion
include ActiveModel::Naming
attr_accessor :title, :article, :content, :author
validates :title, :article, :content, :author, :presence => true
validates :title, :article => {:minimum => 5 }
def initialize(attributes = {})
attributes.each do |name, value|
send("#{name}=", value)
end
end
def persisted?
false
end
end
路线:route.rb
TestBranch::Application.routes.draw do
resources :new_forms
root :to => "new_forms#new"
end
新视图
<%= content_for :title, "New Form" %>
<% if flash[:notice] %>
<p><%= flash[:notice]%></p>
<% end %>
<%= form_for @form do |f| %>
<% if @form.errors.any? %>
<div id="error_explanation">
<h2>
<%= pluralize(@form.errors.count, "error") %> prohibited
this article from being saved:
</h2>
<ul>
<% @form.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<p>
<%= f.label :titleID %> <br/>
<%= f.text_field :titleID %><br/>
</p>
<p>
<%= f.label :articleID %><br/>
<%= f.text_field :articleID %><br/>
</p>
<p>
<%= f.label :content %><br/>
<%= f.text_field :content %><br/>
</p>
<p>
<%= f.label :author %><br/>
<%= f.text_field :author %><br/>
</p>
<p><%= f.submit "Submit" %></p>
<% end %>
您需要向您的控制器添加所需的操作,并向 route.rb
添加相应的路由。这是一个例子:
在route.rb
中:
TestBranch::Application.routes.draw do
resources :new_forms do
collection do
get :new_action1 # will produce /new_forms/new_action1
post :new_action2 # will produce /new_forms/new_action2
delete :new_action3 # will produce /new_forms/new_action3
end
member do
get :new_action4 # will produce /new_forms/:id/new_action4
put :new_action5 # will produce /new_forms/:id/new_action5
delete :new_action6 # will produce /new_forms/:id/new_action6
end
end
root :to => "new_forms#new"
end
控制器:new_forms_controller.rb
class NewFormsController < ApplicationController
...
def new_action1
...
end
def new_action2
...
end
def new_action3
...
end
def new_action4
...
end
def new_action5
...
end
def new_action6
...
end
...
end
resources
基本上可以节省您编写大量代码,并让您能够自己编写代码。因为,你已经要求明确定义你自己的路径,你可以通过以下方式定义它们:
在routes.rb,
get '/users' => 'users#index'
get '/users/:id' => 'users#show'
get '/users/new' => 'users#new'
post '/users' => 'users#create'
get '/users/:id/edit' => 'users#edit'
put '/users' => 'users#update'
delete '/users' => 'users#destroy'
这几行基本等同于resources :users
。此外,您还询问了如何添加更多操作,并为它们定义相应的路由:首先,您可以看看我为 resources :users
写的内容,其次,您可以查看 guides for routes.
您可以使用 match
match 'new_form' => 'new_form#index', :via => :get
这会将对 /new_form
的 get
请求与 new_form
控制器
index
操作相匹配
向资源添加额外的路由非常简单:
自定义 resources
生成的路由非常简单:
resources :users do
collection do
get :search
end
member do
get :info
end
end
这会给我们:
GET /users/search => users#search
GET /users/:id/info => users#info
然而,在添加任何更多路由之前,请问问自己,您要实现的目标是否实际上与现有的 CRUD 操作之一不匹配 - 十有八九是匹配的。