2011-06-19 3 views
0

я получаю сообщение об ошибке «Не удается найти цель с ID», но я не уверен, где я неправильно с кодомНе может найти хуг без 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 # шоу:

def show 
    @goal = Goal.find(params[:id]) 
    @tasks = @goal.tasks 
    @task = Task.new if signed_in?  
end 

tasks_controller.rb # создать это:

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 

Я не уверен, что вопрос, как я следовал один и тот же процесс, который работал для меня раньше, но я сделал что-то неправильно на этот раз.

Я также должен указать, что форма задач находится на странице # цели цели.

+0

Какая ошибка? – apneadiving

+0

Ошибка: «Не удалось найти цель без идентификатора», приложение/контроллеры/tasks_controller.rb: 6: в 'create '. Ошибка в этой строке: ** @ goal = Goal.find (params [: id]) ** – Zakoff

+0

ok, каковы ваши параметры? – apneadiving

ответ

1

Я нашел решение этого вопроса. Мне нужно было скрытое поле в форме, чтобы передать id в метод create в контроллере задач.

<%= hidden_field_tag :goal_id, @goal.id %> 

Надеюсь, это тоже поможет кому-то еще!

0

Вы не проходите мимо params[:id] до create действий вообще. Вот почему вы получаете эту ошибку.

+0

Я использую метод сборки, как показано в рельсах Hartl, здесь http://ruby.railstutorial.org/chapters/user-microposts#sec:creating_microposts.По моему мнению, разница между созданием и сборкой заключается в том, что создание автоматически сохраняется, когда сборка позволяет сохранить ее отдельно. Можете ли вы пояснить, что вы имеете в виду с примером? Когда я делаю @goal = Goal.find (34), он работает – Zakoff

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) 

И ваша форма должна быть изменена соответствующим образом. В вашем случае вы можете эффективно использовать такие вещи, как вложенные формы.

+0

Из-за моего (ограниченного) понимания вложенные ресурсы становятся сложными, когда есть несколько уровней, например, если задача тогда имела много подзадач, а подзадачи имели дополнительные уровни. Вложенные ресурсы приведут к очень длинным URL-адресам – Zakoff

+0

Я только что попробовал подход вложенных ресурсов, и я получаю ту же самую ошибку на данный момент – Zakoff

Смежные вопросы