2011-01-16 1 views
2

레일스의 올바른 용어를 모르는 것 같지만, 찾고 있습니다 ....레일에 자식 모델 만들기 (belongs_to) 부모 ID 미리 설정

Project 모델 has_many TaskTask belongs_to는 Project입니다.

routes.rb

resources :projects 
resources :tasks 

내가/편집/생성 Projects가 잘 수정하고, 나는 또한 Tasks 편집 할 수있다 ...하지만 난 새로운 Task을 만드는 방법을 해결할 수없는 것, 그렇게 할 때 올바른 Project을 할당하십시오.

Project 페이지 (예 :/projects/2)에는/task/new로 이동하는 작업 추가 링크가 있으므로 연결이 끊어집니다. Tasks은 일단 생성되면 ID로 고유하게 식별 할 수 있기 때문에 중첩 된 리소스를 만들고 싶지 않습니다. 앞으로는 다른 모델도 있습니다.

빠른 수정본이 있습니까?

편집 글쎄, 나는 이것을 해결할 수 있었다. 그것은 추악하다. 그리고 그것은 끔찍한 것이고, 왜 그런 식으로되어야하는지 잘 모르겠다.

내 경로 :

resources :projects do 
    resources :tasks, :only => [:new] 
end 

resources :tasks, :except => [:new] 

내 작업 컨트롤러 :

def new 
    @project = Project.find(params[:project_id]) 
    @task = @project.tasks.build 
end 

# Process the form for creating a new task. 
def create 
    @project = Project.find(params[:task][:project_id]) 
    @task = @project.tasks.build(params[:task]) 
    if @task.save 
    flash[:success] = 'Task created.' 
    redirect_to project_path(@project) 
    else 
    render 'new' 
    end 
end 

그리고 내 작업 형태 :

<%= semantic_form_for @task do |f| %> 

<%= render 'shared/form_message', :object => f.object %> 

<%= f.inputs do %> 
    <%= f.input :name %> 
    <%= f.input :project %> 
<% end %> 

<ul class="formActions"> 
    <li class="list"><%= link_to 'Back to list', project_path(@task.project) %></li> 
    <li><%= f.submit "Save" %></li> 
</ul> 

<% end %> 

나는에서 프로젝트 상자를 넣어 가지고 싶지 않았다 양식, 그리고 난 아직도 내가 왜 해야하는지, 그리고 내가 왜 걸릴 필요가 확실하지 않다 :중첩 된 경로 중. 그것은 또한 일반적인 일을 위해서 꽤 힘들어 보이지만 작동합니다, 그래서 ... 나는 그것이 모두 좋은 것 같아요.

답변

1

IT 사운드는 원하는 작업을 생성하기위한 중첩 된 경로입니다.

resources :projects do 
    resources :tasks, :only=>[:new, :create] 
end 
resources :tasks, :except=>[:new, :create] 

편집 : 여기에 조금 청소기해야 코드의 수정 된 버전입니다. edgerunner에서 조금 차용했습니다.

작업 컨트롤러 :

before_filter :get_project 

def new 
    @task = Task.new 
end 

# Process the form for creating a new task. 
def create 
    @task = Task.new params[:task] 
    @task.project_id = params[:project_id] 
    if @task.save 
    flash[:success] = 'Task created.' 
    redirect_to project_path(@task.project_id) 
    else 
    render 'new' 
    end 
end 

private 

def get_project 
    @project = Project.find(params[:project_id]) 
end 

그리고 작업 양식 :

<%= form_for [@project, @task] do |f| %> 

    <%= render 'shared/form_message', :object => f.object %> 

    <%= f.inputs do %> 
    <%= f.input :name %> 
    <% end %> 

    <ul class="formActions"> 
    <li class="list"><%= link_to 'Back to list', project_path(@task.project) %></li> 
    <li><%= f.submit "Save" %></li> 
    </ul> 

<% end %> 
+0

흠, 내 경로가 변경되었지만 여전히 문제가 있습니다. TaskController를 변경하여 부모 프로젝트를 통해 Task를 생성하지만 여전히 작동하지 않습니다. : – sevenseacat

+0

이런 종류의 일을하는 자습서를 알고 계시겠습니까? – sevenseacat

+0

http://railscasts.com/episodes/139-nested-resources를 보시길 바랍니다. – aNoble

2

확인이 프로젝트 ID와 함께 올 것이다 있도록 새로운 작업 동작에서 프로젝트를 통해 새 작업을 구축해야합니다 이미 배정 된 그렇게하면 폼 생성기가 올바르게 작동하고 올바른 작업을 수행해야합니다.

TasksController < AplicationController 
    before_filter :get_project 
    … 
    def new 
    @task = @project.tasks.build # don't use @task = Task.new here! 
    end 
    … 
    def get_project 
    @project = Project.find(params[:project_id]) 
    end 
end 

물론 이와 함께 중첩 된 경로를 사용하는 것이 좋습니다.

resources :projects do 
    resources :tasks 
end