我正在通过Mike Hibbert的视频学习使用Windows 7,rails 4.0.2和ruby 2.0。
在这一个“https://www.youtube.com/watch?v=fr8u3l6RWOQ&list=UUFW_fvwCoF44MGWk74U_rFg”我应该创建一个“Todo List”,但是我不能创建一个新的Todo,我不知道为什么。 我每次都会收到此错误:
ActionController::UrlGenerationError in Todoo#new
Showing c:/Users/Suporte 2/MikeHibbert/todo/app/views/todoo/new.html.erb where line #2 raised:
No route matches {:id=>#<Todoo id: nil, created_at: nil, updated_at: nil, done: nil>} missing required keys: [:id]
Extracted source (around line #2):
1 <h1>Add new item to your todoo list</h1>
2 <% form_for @todo, :url => todoo_path(@todo) do |f|%>
3 <%= f.label :name %>: <%= f.text_field :name %>
4 <%= f.hidden_field :done, :value => false %>
5 <%= f.submit "Add to todoo list" %>
Rails.root: c:/Users/Suporte 2/MikeHibbert/todo
Application Trace | Framework Trace | Full Trace
app/views/todoo/new.html.erb:2:in `_app_views_todoo_new_html_erb__1061113415_24422844'
这是我的 routes.rb :
Todo::Application.routes.draw do
devise_for :users
root :to => "home#index"
resources :todoo
end
todoo_controller 中的“创建”功能:
def new
@todo = Todoo.new
end
def todo_params
params.require(:todoo).permit(:name, :done, :id)
end
def create
@todo = Todoo.new(todo_params)
if @todo.save
redirect_to todoo_index_path, :notice => "Your todo item was created!"
else
render "new"
end
end
我的 new.html.erb :
<h1>Add new item to your todoo list</h1>
<% form_for @todo, :url => todoo_path(@todo) do |f|%>
<%= f.label :name %>: <%= f.text_field :name %>
<%= f.hidden_field :done, :value => false %>
<%= f.submit "Add to todoo list" %>
<% end %>
我的佣金路线:
Prefix Verb URI Pattern Controller#Action
new_user_session GET /users/sign_in(.:format) devise/sessions#n
ew
user_session POST /users/sign_in(.:format) devise/sessions#c
reate
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#d
estroy
user_password POST /users/password(.:format) devise/passwords#
create
new_user_password GET /users/password/new(.:format) devise/passwords#
new
edit_user_password GET /users/password/edit(.:format) devise/passwords#
edit
PATCH /users/password(.:format) devise/passwords#
update
PUT /users/password(.:format) devise/passwords#
update
cancel_user_registration GET /users/cancel(.:format) devise/registrati
ons#cancel
user_registration POST /users(.:format) devise/registrati
ons#create
new_user_registration GET /users/sign_up(.:format) devise/registrati
ons#new
edit_user_registration GET /users/edit(.:format) devise/registrati
ons#edit
PATCH /users(.:format) devise/registrati
ons#update
PUT /users(.:format) devise/registrati
ons#update
DELETE /users(.:format) devise/registrati
ons#destroy
root GET / home#index
todoo_index GET /todoo(.:format) todoo#index
POST /todoo(.:format) todoo#create
new_todoo GET /todoo/new(.:format) todoo#new
edit_todoo GET /todoo/:id/edit(.:format) todoo#edit
todoo GET /todoo/:id(.:format) todoo#show
PATCH /todoo/:id(.:format) todoo#update
PUT /todoo/:id(.:format) todoo#update
DELETE /todoo/:id(.:format) todoo#destroy
记住我正在使用设计 gem来管理用户。
任何人都可以帮忙解决这个问题吗?
答案 0 :(得分:2)
您需要纠正的第一件事是您的路线:
替换
resources :todoo
使用
resources :todoos ## Notice plural
您应该使用小写的多元化资源名称定义RESTful路由。
接下来,您需要修复form_for
todoos/new.html.erb
替换
<% form_for @todo, :url => todoo_path(@todo) do |f|%>
使用
<%# Removed url option and added = so that form is rendered %>
<%= form_for @todo do |f|%>
form_for
帮助程序将根据@todo
的值来处理路由。如果@todo
不是现有的todoo
记录,则表单将提交给TodoosController#create
操作
如果@todo
是现有的todoo
记录,则表单将提交给TodoosController#update
操作。
此外,为了执行以及在ERB template
中呈现Ruby代码的结果,您需要使用<%= %>
而不是<% %>
<强>更新强>
Rails遵循 Convention over confguration 原则。确保在为todoos
资源创建MVC结构时遵循Rails命名约定。
控制器名称应在文件名TodoosController
内复数todoos_controller.rb
。
Views 应放在app/views/todoos
目录下。再次注意todoos
是多元化的。
模型名称应在名为Todoo
的文件中单独化为todoo.rb
,并且数据库中相应的表名应复数为{{ 1}}。
我建议的另一件事是与更改todoos
同步更新整个应用程序中的路由引用。
例如:在resources :todoos
操作中:
替换
create
使用
redirect_to todoo_index_path, :notice => "Your todo item was created!"
另外,更改redirect_to todoos_path, :notice => "Your todo item was created!"
如下:
todo_params
答案 1 :(得分:1)
<h1>Add new items to your todo list</h1>
<%= form_for @todo, :url => todoo_index_path(@todo) do |f| %>
<%= f.label :name %><%= f.text_field :name %>
<%= f.hidden_field :done, :value => false %>
<%= f.submit "Add to todo list" %>
<% end %>
我目前正在做相同的教程,我有完全相同的问题。一些细心的谷歌搜索,我遇到了http://www.kylembrown.com/programming/learning-ruby-on-rails。这就是我在上面找到答案的地方。好像它与选择的路线有关。也许其他人可以启发我们纠正这些问题的原因。