2011-06-18 103 views
7

我經歷了大量的form_for嵌套資源問題,無法獲得任何解決方案爲我工作。我想它是時候提出一個個性化的問題。嵌套資源的形式

我有兩個模型,工作和問題,工作has_many問題和questions_to_ jobs。

我用腳手架來創建控制器和模型,然後將這些資源嵌套在routes.rb中。

root :to => "pages#home" 

resources :jobs do 
    resources :questions 
end 

get "pages/home" 
get "pages/about" 
get "pages/contact" 


class Job < ActiveRecord::Base 
    has_many :questions 
end 

class Question < ActiveRecord::Base 
    belongs_to :job 
end 

現在我試圖訪問「/職位/ 1 /問題/新」和不斷收到在問題#新的

NoMethodError

我開始與錯誤沒有路由匹配{:控制器=>「問題」}當代碼爲

<%= form_for(@question) do |f| %> 

我知道這是不對的,所以我就開始嘗試其他的連擊和他們沒有工作。

我已經試過

<%= form_for([@job.questions.build ]) do |f| %> 

<%= form_for([@job, @job.questions.build ]) do |f| %> 

<%= form_for(@job, @question) do |f| %> 

在很多其他的組合,並且不工作。

這裏是我的耙路線的鏈接:git的克隆https://gist.github.com/1032734

任何幫助表示讚賞,讓我知道,如果你需要更多的信息,謝謝。

回答

12

我只是通過URL作爲一個額外的選項:

<%= form_for(@question, :url => job_questions_path(@job)) do %> 

編輯:

相關搜索:

form_for([@job, @question]) 
+0

第一選項工作,謝謝! - 什麼傳遞的網址可以解決這個問題?此外,問題的job_id不在數據庫中更新 - 任何想法如何解決這個問題?僅供參考:編輯返回此錯誤:沒有路由匹配{:controller =>「questions」} – Igrabes

+0

當您不通過':url'選項時,Rails會嘗試自行解決它。它不知道'Question'總是'Job'的子資源,因爲它並不總是必須的。關於'job_id'沒有被更新,如果你正在使用批量分配,它可能會忽略它。分別調用'question.job = new_job'。雖然我看不到你的代碼。 – d11wtq

+0

嘿@ d11wtq,我不完全確定你的意思是通過調用question.job = new_job - 那裏去?這是我的回購[鏈接(https://github.com/igrabes/InterQ),如果有幫助。 – Igrabes

2

這是我如何解決我的:)

在您的questions/_form.html.erb

<%= form_for [@job, @question] do %> 

爲了這個工作,你需要工作的ID。你會如下傳遞: 在questions_controller.rb

def new 
    @job = Job.find(params[job_id]) 
    @question = @job.questions.build 
end 

生成(.build)類似於使用新(.new)在上面的代碼中,只有在舊版本軌的差異;導軌2向下。現在

爲創建行動(仍在questions_controller.rb

def create 
    @job = Job.find(params[:job_id]) 
    @question = @job.questions.build(question_params) 
end 

如果你只使用這些,在問題模型JOB_ID和USER_ID字段將是空的。要添加的ID,這樣做: 在你questions_controller.rb添加JOB_ID到job_params像這樣:

def question_params 
    params.require(:question).permit(:ahaa, :ohoo, :job_id) 
end 

然後通過用戶的ID(如果你使用的設計),這樣做:

def create 
    @job = Job.find(params[:job_id]) 
    @question = @job.questions.build(question_params) 
    @question.user_id = current_user.id 
end