Ruby on rails 轨道4:使用形式_,无路线,柱
通过Lynda开始学习RubyonRails-非常激动,我正在尽可能多地练习。我正在关注这些练习,但培训是基于Rails 3的-到目前为止,有些用法还不被接受 情况如下: 我在subjects/new达到创建表单 填写表格 返回以下错误 没有与[POST]“/subjects/create”匹配的路由 Rails.root:/Users/alpozenalp/Sites/simple\u cms 在过去的两个小时里,我在stackoverflow、rail guide和所有其他来源周围闲逛——尝试了许多变体,但都无法通过这一阶段 非常感谢你的帮助 routes.rbRuby on rails 轨道4:使用形式_,无路线,柱,ruby-on-rails,routes,Ruby On Rails,Routes,通过Lynda开始学习RubyonRails-非常激动,我正在尽可能多地练习。我正在关注这些练习,但培训是基于Rails 3的-到目前为止,有些用法还不被接受 情况如下: 我在subjects/new达到创建表单 填写表格 返回以下错误 没有与[POST]“/subjects/create”匹配的路由 Rails.root:/Users/alpozenalp/Sites/simple\u cms 在过去的两个小时里,我在stackoverflow、rail guide和所有其他来源周围闲逛——尝
SimpleCms::Application.routes.draw do
root :to => "demo#index"
get ':controller(/:action(/:id(.:format)))'
end
受试者控制器.rb
class SubjectsController < ApplicationController
def index
list
render('list')
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
# Instantiate a new object using form parameters
@subject = Subject.new(params[:subject])
# Save the object
if @subject.save
# If save succeeds, redirect to the list action
redirect_to(:action => 'list')
else
# If save fails, redisplay the form so user can fix problems
render('new')
end
end
end
class SubjectsController'list')
其他的
#如果保存失败,请重新显示表单,以便用户可以修复问题
呈现('新')
结束
结束
结束
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'}, :method => :post) 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 %>
</div>
'list'},:class=>'backlink')%>
创建主题
{:action=>'create'},:method=>:post)do | f |%>
名称
位置
看得见的
只要这样做,就不会有任何问题
<%= form_for @subject do |f| %>
如果@subject
是现有记录(id为1),您将获得
<form action="/subjects" method="post">
...
<form action="/subjects/1" method="post">
<input type="hidden" name="_method" value="put">
...
变成这样
<%= link_to '« Back to List'.html_safe, subjects_path, class: 'back-link' %>
naomik的回答肯定会帮助表单更简洁,但听起来你只需要在
config/routes.rb
文件中为主题添加一条路线:
SimpleCms::Application.routes.draw do
resources :subjects
root :to => "demo#index"
end
更多信息请访问
编辑:根据naomik的建议,删除了默认的后备路线。我在Lynda.com课程中遇到了同样的问题。通过在
get:'controller(/:action(/:id(:format))”
上方添加resources:subjects
,然后将subjects\u controllercreate
action更改为
def create
@subject = Subject.new(params.require(:subject).permit(:name, :position, :visible))
if @subject.save
redirect_to(:action => 'list')
else
render('new')
end
end
这避免了之前编写的操作中出现的禁止属性错误
因为我添加了
resources:subjects
,这就意味着上面的重定向到(:action=>'list')
将创建一个错误,其内容是“找不到id=list的主题”。为了解决这个问题,我在resources:subjects
路线上方添加了get'subjects/list'=>“subjects#list'
(我不知道这是否是一个“正确”的做法,但它现在起作用)。我已经完成了课程,我的路线如下所示:
Cms2::Application.routes.draw do
root to: "public#index"
get 'admin', :to => 'access#menu'
get 'show/:id', :to => 'sections#show'
get ':controller(/:action(/:id(.:format)))'
post "admin_users/update"
post "subjects/update"
post "pages/update"
post "sections/update"
post "subjects/destroy"
post "subjects/create"
post "pages/destroy"
post "pages/create"
post "sections/destroy"
post "sections/create"
post "admin_users/destroy"
post "admin_users/create"
post "access/attempt_login"
get "access/logout"
end
我的def create控制器如下所示:
def create
#new_position = params[:subject].delete(:position)
# Instantiate a new object using form parameters
@subject = Subject.new(params.require(:subject).permit(:name, :position, :visible, :created_at, :updated_at))
# Save the object
if @subject.save
#@subject.move_to_position(new_position)
# If save succeeds, redirect to the list action
flash[:notice] = "Subject Created."
redirect_to(:action => 'list')
else
# If save fails, redisplay the form so user can fix problems
@subject_count = Subject.count +1
render('new')
end
end
希望有帮助 而且
我不会为新手建议后备路线。这是非常老派的Ruby-on-Rails。如果操作只是从Rails 4开始,我会让他们从右脚开始。naomik:这是一个很好的观点。但是,这已经在上面的OP发布的路由文件中了。我刚刚添加了subjects
resource非常感谢-但是在删除回退路径后,现在我在SubjectsController中找到了ActiveRecord::RecordNotFound#show找不到id=show Extracted source的Subject(在第13行附近):11 12 13 14 15 def show@Subject=Subject.find(参数[:id])end def new Rails.root:/Users/alpozenalp/Sites/simple\cmsso它试图路由到subjects/id=show或id=list,而路由应该是subjects/show,subjects/list有什么建议吗?嗯,我不太确定。“找不到主题”意味着你可能试图查看或编辑一些不存在的内容?我不确定。但老实说,从你给出的代码来看,我不确定林达的课程是否很好。为了更好、更免费(在线图书版本是——但有些付费视频或印刷图书不是免费的),我建议看一看这个教程(它总是保持最新的):
def create
#new_position = params[:subject].delete(:position)
# Instantiate a new object using form parameters
@subject = Subject.new(params.require(:subject).permit(:name, :position, :visible, :created_at, :updated_at))
# Save the object
if @subject.save
#@subject.move_to_position(new_position)
# If save succeeds, redirect to the list action
flash[:notice] = "Subject Created."
redirect_to(:action => 'list')
else
# If save fails, redisplay the form so user can fix problems
@subject_count = Subject.count +1
render('new')
end
end