nil:NilClass 的未定义方法“项目”
undefined method `project' for nil:NilClass
我创建了多对一关联的项目脚手架和阶段脚手架。现在,我添加了与阶段脚手架具有多对一关联的任务脚手架。但我无法正确呈现任务表单。
error
routes.rb:
resources :projects do
resources :stages do
resources :tasks
end
end
任务form.html.erb
<%= form_with(model: task, url: projects_stages_tasks_path(@stages, @stages.project), local: true) do |form| %>
<% if task.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(task.errors.count, "error") %> prohibited this task from being saved:</h2>
<ul>
<% task.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= form.label :task_name %>
<%= form.text_field :task_name %>
</div>
<div class="actions">
<%= form.submit 'Create', :class=>'button primary small' %>
</div>
<% end %>
tasks_controller.rb
def index
@tasks = Task.all
end
def new
@task = Task.new
end
根据您所写的内容,我了解到您正在尝试创建一个 task
表单作为嵌套资源。所以我会这样做:首先,确保您在 tasks_controller
:
中设置了 @project
和 @stage
变量
before_action :set_project
before_action :set_stage
# ...
private
def set_project
@project = Project.find(params[:project_id])
end
def set_stage
@stage = @project.stages.find(params[:stage_id]) # Project#stages association is assumed to exist here
end
然后,在操作本身中设置您的 @task
变量,如下所示:
def new
@task = @stage.tasks.build # Stage#tasks association is assumed to exist here
end
然后,在您看来,您可以使用常规形式,这样您就不必自己指定 url(好吧,我猜):
<%= form_with model: [@project, @stage, @task] do |f| %>
等等
我创建了多对一关联的项目脚手架和阶段脚手架。现在,我添加了与阶段脚手架具有多对一关联的任务脚手架。但我无法正确呈现任务表单。 error
routes.rb:
resources :projects do
resources :stages do
resources :tasks
end
end
任务form.html.erb
<%= form_with(model: task, url: projects_stages_tasks_path(@stages, @stages.project), local: true) do |form| %>
<% if task.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(task.errors.count, "error") %> prohibited this task from being saved:</h2>
<ul>
<% task.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= form.label :task_name %>
<%= form.text_field :task_name %>
</div>
<div class="actions">
<%= form.submit 'Create', :class=>'button primary small' %>
</div>
<% end %>
tasks_controller.rb
def index
@tasks = Task.all
end
def new
@task = Task.new
end
根据您所写的内容,我了解到您正在尝试创建一个 task
表单作为嵌套资源。所以我会这样做:首先,确保您在 tasks_controller
:
@project
和 @stage
变量
before_action :set_project
before_action :set_stage
# ...
private
def set_project
@project = Project.find(params[:project_id])
end
def set_stage
@stage = @project.stages.find(params[:stage_id]) # Project#stages association is assumed to exist here
end
然后,在操作本身中设置您的 @task
变量,如下所示:
def new
@task = @stage.tasks.build # Stage#tasks association is assumed to exist here
end
然后,在您看来,您可以使用常规形式,这样您就不必自己指定 url(好吧,我猜):
<%= form_with model: [@project, @stage, @task] do |f| %>
等等