我正在创建一个用户有任务,文档,约会等的应用程序,但是当我尝试在/ users /创建一个新任务时,我一直遇到这个错误:id / tasks / new
任务#create中的NoMethodError
#<#:0x007ff9ed2fd200>的未定义方法`tasks_path' 你的意思是? asset_path
并在控制台日志中显示
Started POST "/users/2/tasks" for 127.0.0.1 at 2017-04-27 22:22:52 -0400
Processing by TasksController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"YG2qRnuHT92OsJ2OkMrU9ztNTD+zVb88jiRN+tr85sX5E68zeGsxkv++ecI76Txx0iNPmX/jw3rLlBRf1EJ0yQ==", "task"=>{"name"=>"d", "description"=>"d"}, "commit"=>"Create Task", "user_id"=>"2"}
(0.1ms) begin transaction
(0.0ms) rollback transaction
Rendering tasks/new.html.erb within layouts/application
Rendered tasks/new.html.erb within layouts/application (161.5ms)
Completed 500 Internal Server Error in 170ms (ActiveRecord: 0.1ms)
ActionView::Template::Error (undefined method `tasks_path' for #<#<Class:0x00555bf7a14598>:0x007ff9ed2fd200>
Did you mean? asset_path):
1: New Task:
2:
3: <%= form_for [@user, @task] do |f| %>
4:
5: <div>
6: <%= f.label :name %><br/>
这是我的控制器:
class TasksController < ApplicationController
def new
@user = current_user
@task = Task.new
end
def create
@user = current_user
@task = Task.new(task_params)
if @task.save
redirect_to '/'
else
rendirect_to '/'
end
end
def edit
@task = Task.find(params[:id])
end
def destroy
end
def show
@task = Task.find(params[:id])
end
def index
@task = Task.all
end
private
def task_params
params.require(:task).permit(:name, :description)
end
end
(我为了测试目的而重定向到'/')
这是我的routes.rb
Rails.application.routes.draw do
root 'home#index'
resources :home, only: [:index]
resources :users do
resources :appointments, :tasks, :documents
end
resources :sessions, only: [:new, :create, :destroy]
end
task.rb
class Task < ApplicationRecord
belongs_to :user
end
user.rb
class User < ApplicationRecord
has_secure_password
has_many :tasks
has_many :appointments
has_many :documents
end
最后是新任务的视图
<%= form_for [@user, @task] do |f| %>
<div>
<%= f.label :name %><br/>
<%= f.text_field :name %>
</div>
<div>
<%= f.label :description %><br/>
<%= f.text_area :description %>
</div>
<%= f.submit %>
<% end %>
我已经把头发拉了好几个小时,所以感谢任何帮助。
答案 0 :(得分:1)
你有两个问题。回滚是由于验证失败。在这种情况下,它是隐式的:belongs_to
默认验证是否存在。由于您实际上没有将用户分配给任务,因此nil
。def create
@task = Task.new(task_params)
@task.user = current_user
# ...
end
。试试这个:
task_path
至于rake routes
不存在,我相信它是因为你把它嵌套了。您可以随时检查tasks
或点击应用程序中不存在的页面,以获取可用路线助手的列表。在这种情况下,我认为你应该从users
取消嵌套user_id
,因为你实际上并没有在URL中使用resources :users
resources :tasks
param。
rendirect_to
然后你就开始了。
哦,请注意拼写错误:您的create
操作else
条款中有redirect_to
。你几乎肯定是#header {
position: relative;
width: 100%;
height: 50px;
background: #CCC;
}
#formBox {
position: absolute;
left: calc(50% - 100px);
bottom: -100px;
width: 200px;
height: 100px;
background: orange;
}
#bodyStuff {
width: 100%;
height: 300px;
background: lightBlue;
}
。