Todoo中的ActionController :: UrlGenerationError #new

时间:2014-08-11 13:20:32

标签: ruby-on-rails ruby ruby-on-rails-4 devise

我正在通过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来管理用户。

任何人都可以帮忙解决这个问题吗?

2 个答案:

答案 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。这就是我在上面找到答案的地方。好像它与选择的路线有关。也许其他人可以启发我们纠正这些问题的原因。