我收到错误“无法找到带有ID的目标”,但我不确定代码出错的地方
模型如下:
A Goal has_many Tasks
A Task belongs_to Goal
创建任务如下:
routes.rb是:
resources :goals, :only => [:create, :destroy, :show, :index]
resources :tasks, :only => [:create, :destroy, :show, :index]
goals_controller.rb #show is:
def show
@goal = Goal.find(params[:id])
@tasks = @goal.tasks
@task = Task.new if signed_in?
end
tasks_controller.rb #create是:
def create
**@goal = Goal.find(params[:id])**
@task = @goal.tasks.build(params[:task])
if @task.save
flash[:success] = "Task created!"
redirect_to goal_path(@task.goal.id)
else
render home_path
end
end
以粗体显示的行是发生错误的位置。我注意到以下几点:
@goal = Goal.find(params[:goal_id]) does not work either
@goal = Goal.find(34) works, and so do other integers I enter here
我不确定问题是什么,因为我已经遵循了之前对我有用的相同过程,但这次我做错了。
我还应该说明任务表格在目标#show page。
上答案 0 :(得分:1)
我找到了解决方法。我需要表单中的隐藏字段将id传递给任务控制器中的create方法。
<%= hidden_field_tag :goal_id, @goal.id %>
希望这也可以帮助其他人!
答案 1 :(得分:0)
您根本没有将params[:id]
传递给create
行动。这就是您收到此错误的原因。
答案 2 :(得分:0)
我强烈建议您使用nested routes,例如:
resources :goals, :only => [:create, :destroy, :show, :index] do
resources :tasks, :only => [:create, :destroy, :show, :index]
end
然后你可以使用:
@goal = Goal.find(params[:goal_id])
...在您的create
行动中。
但请注意,您需要更改视图中的URL生成器,例如:
new_goal_task_path(@goal, @task)
您的表单需要相应修改。您可以非常有效地使用嵌套表单等内容。