1

레일즈에 익숙해지기 위해 To Do 애플리케이션을 구축 중입니다. 내 앱에는 4 가지 계층 구조가 있습니다.중첩 된 리소스로 form_for 사용하기

  1. 사용자
  2. 목표 (다중 사용자 당 목표)
  3. 작업 (목표 당 여러 개의 작업)
  4. 하위 작업 (작업 당 여러 개의 하위)

을 나는 작업 프론트 엔드 양식이 중첩 된 리소스를 사용하는 각각에 대해 내 routes.rb 내가 지금 좋아 바로 사용자 컨트롤러의보기 중 하나에서 모든 형태를 가지고있다 것이 무엇이

resources :goal do 
    resources :task do 
    resources :subtask 
    end 
end 

같은 것을 가지고있다.

이 내가 만드는 시도 형태 :

<%= form_for @task, url: {controller: 'task', action: 'create'} do |f| %> 

<%= f.label :description %> 

<%= f.text_field :description %> 

<%= f.submit "Add Goal", class: "btn" %> 

<% end %> 

을하지만이 오류를

No route matches {:action=>"create", :controller=>"task", :id=>"1"} 

치울 : ID => 1 내가 오전 사용자 페이지에 해당합니다 (http://localhost:3000/user/1)

내가 알기로는이 단계가 의도 된 goal_id를 어디에도 제공하지 않았다는 것입니다. 이 방법을 구현할 생각은 없습니다.

내가 알아 차린 또 다른 점은 rake routes에 대한 응답이 많은 URI 경로를 보여 주지만 POST 메서드에는 아무 것도 표시되지 않는다는 것입니다. url:에있는 form_for에있는 경로를 POST 방법과 일치시키지 않기 때문에이 경로를 사용할 수 없습니다.

그래서 제 질문은 다음과 같습니다

  1. 당신이 중첩 된 방법이 form_for 라우트를 자원?
  2. 작성 작업이 올바르게 라우팅되도록 form_for를 사용하는 동안 상위 리소스의 ID를 제공하는 방법은 무엇입니까?
+0

아마이 당신에게 몇 가지 아이디어를 줄 것이다 : HTTP : // 유래 .com/questions/2034700/form-with-nested-resources – dp7

+0

레이크 경로를 만들고 작업 생성 경로를 확인하십시오. 사용자 ID는 아마 : id로 표시되지 않습니다. – Syl

+0

아니요 나는'/ goal/: goal_id/task'을 생성 작업 경로로 가지고 있습니다. 예, 없습니다 :이 경로에있는 ID는 아직 : goal_id 어딘가에 제공해야하고 (질문에서 언급 한 것처럼) 어떻게 해야할지 잘 모릅니다. –

답변

1

일반적으로 두 단계를 넘어서는 경로를 중첩하는 것은 좋지 않습니다. 명령 줄에서 "번들 간부 레이크 경로"를 실행하면

resources :goal do 
    resources :task 
    end 

resources :task do 
     resources :subtask 
    end 

지금 당신이 중첩 된 경로 및 해당 헬퍼를 모두 볼 수 있습니다 : 나는 당신의 경로를 변경합니다. 현재 문제는 form_for 메소드에 있습니다.

마지막으로
<%= form_for [@goal,@task] do |f| %> 
    blah blah 
<% end %> 

, @goal도 아직 정의되지 않는다 당신이 작업에 '새로운'행동을 정의해야합니다 그래서 : 당신은있는이 경우에 있어야 중첩 된 자원을 추가 할 필요가 제어 장치. 이것은 보통 params 해시를 통해 작업이 연결될 목표의 ID와 '새로운'양식으로 이동하는 데 사용되는 'link_to'를 전달하여 수행됩니다.그런 다음 작업 컨트롤러의 새로운 행동 :

당신의 '생성'행동 그리고
@goal = Goal.find(params[:goal_id]) #The parameter can be named anything 
@task = Task.new 

당신이 연관이 만든해야합니다

@task = Goal.tasks.new(task_params) 
if @task.save 
    flash[:success] = "Woot" 
    redirect_to somewhere_awesome_path 
else 
    whatever 
end 
+0

'form_for [@ goal, @ task]를 사용하면''# 에 대한 정의되지 않은 메소드 goal_tasks_path '라는 오류가 발생합니다. 실제로 파악할 수없는 것은 목표 ID가 param은 당신이 제안한대로 link_to를가집니다. 또한이 양식은 작업 제어기 또는 목표 제어기와 연관된보기에 없으며 실제로는 사용자 제어기와 연관된 show.html.erb에 있습니다. 양식이 사용자 대신 다른 컨트롤러를 찾는 것을 어떻게 알 수 있습니까? –

+0

답장을 보내 주셔서 감사합니다. 조금만 더 도움이 필요합니다 :) –

+0

문제 없습니다. '@goal'과 '@task'를 폼 디스플레이에 연결된 액션 안에 정의하고 싶다면 Show 액션 안에 사용자 컨트롤러에 정의 할 수 있습니다. 그런 다음 "url : {controller : 'task', action : 'create'}"부분과 같이 양식이 제출할 경로를 정의 할 수 있습니다. goal_id를 전달하는 경우 미리 값으로 양식 안의 hidden_field로 추가 할 수 있습니다. 예를 들어 <% = f.hidden_field : 목표, 값 : '무엇이든 값'%> – bkunzi01

관련 문제