【问题标题】:ActionController::UrlGenerationError in Todoo#newTodoo 中的 ActionController::UrlGenerationError#new
【发布时间】:2014-08-11 13:20:32
【问题描述】:

我正在通过 Mike Hibbert 的视频学习 rails,使用的是 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 %>

还有我的rake路线

                  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

记住我正在使用 devise gem 来管理用户。

谁能帮忙解决这个问题?

【问题讨论】:

  • 尝试从表单中删除, :url =&gt; todoo_path(@todo)
  • 已尝试,出现以下错误:'code'NoMethodError in Todoo#new Showing c:/Users/Suporte 2/MikeHibbert/todo/app/views/todoo/new.html.erb where line #2 提出:#:0x4cf5048> 的未定义方法 `todoos_path'
  • 把这个方法def todo_params params.require(:todoo).permit(:name, :done, :id) end放在控制器底部private
  • 没用,出现同样的错误。

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


【解决方案1】:

您需要纠正的第一件事是您的路线:

替换

resources :todoo

resources :todoos ## Notice plural

您应该使用小写的复数资源名称来定义 RESTful 路由。

接下来,你需要修复todoos/new.html.erb中的form_for

替换

<% 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 代码的结果,您需要使用 &lt;%= %&gt; 而不是 &lt;% %&gt;

更新:

Rails 遵循约定优于配置的原则。确保在为 todoos 资源创建 MVC 结构时遵循 Rails 命名约定。

控制器名称应该是复数形式的TodoosController,在文件名todoos_controller.rb中。

Views 应该放在app/views/todoos 目录下。再次注意todoos 是复数形式。

模型名称在一个名为todoo.rb的文件中应单数化为Todoo,数据库中对应的表名应复数为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 更改如下:

def todo_params
  params.require(:todoo).permit(:name, :done) ## Notice todoo and NOT todo
end

【讨论】:

  • 现在我收到错误消息:Routing Error No route matches [GET] "/todoo/new" Rails.root: c:/Users/Suporte 2/MikeHibbert/todo
  • 确保您首先恢复您在相关代码中所做的所有更改。重新启动服务器并再次验证。如果您仍然收到错误,请告诉我您收到错误的确切位置:在控制器中还是在视图中。
  • 我很确定一切都和以前一样。作为记录,我的控制器被命名为todoo_controller.rb 不是复数形式,就像我的视图文件夹只有todoo 这可能是个问题吗?我重新启动了服务器,但仍然出现同样的错误。这是一个路由错误"No route matches [GET] "/todoo/new"
  • 是的..那会是个问题。让我更新答案以反映它。
  • 阅读我的更新答案,详细了解 Rails 命名约定。
【解决方案2】:
<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 %>

我目前正在做同样的教程,我遇到了完全相同的问题。一些仔细的谷歌搜索,我遇到了,@ 987654321@。这就是我在上面找到答案的地方。似乎它与选择的路线有关。也许其他人可以启发我们解决问题的原因。

【讨论】:

    猜你喜欢
    • 2015-10-30
    • 1970-01-01
    • 2015-05-23
    • 2016-10-30
    • 2015-12-30
    • 2018-05-12
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    相关资源
    最近更新 更多