找不到ID的xyz

时间:2011-06-19 09:04:54

标签: ruby-on-rails ruby-on-rails-3

我收到错误“无法找到带有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。

3 个答案:

答案 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)

您的表单需要相应修改。您可以非常有效地使用嵌套表单等内容。