2012-01-24 220 views
1

這是我的問題。如果我去Projects#edit,我無法改變它分配給的路線。如果我試圖創建一個新的課程,或從現有的一個選擇,我得到以下錯誤:Rails 3.2更新嵌套屬性

Couldn't find Course with ID=23 for Project with ID=62 
app/controllers/projects_controller.rb:49:in `update' 

{... 
"project"=>{"title"=>"Sup", 
"due_date"=>"2012-01-23", 
"course_id"=>"27",      # THIS IS THE ID OF THE NEW COURSE I WANT 
"course_attributes"=>{"name"=>"Calc I", # THIS IS THE OLD ONE, I don't need this. Why is it passing this? 
"number"=>"MATH102", 
"user_id"=>"3", 
"id"=>"23"}, 
"description"=>"bla bla bla"}, 
"commit"=>"Update Project", 
"user_id"=>"3", 
"id"=>"62"} 

所以我可以看到,它試圖在course_attributes通過,但它實際上沒有設置新的course_id。我不明白爲什麼course_attributes被傳遞,另一種形式是空白的,course_attributes被傳遞,是舊課程的屬性。我想設置course_id爲被傳遞的course_id(在這種情況下爲27)。

ProjectsController

def new 
    @project = @user.projects.new 
    @courses = @user.courses # Used to populate the collection_select 
    @project.build_course  # I was informed I need to use this to get the form_for to work 
end 

def edit 
    @project = Project.find(params[:id]) 
    @courses = @user.courses # Used to populate the collection_select 
end 

def update 
    @project = Project.find(params[:id]) 
    @courses = @user.courses 

    if @project.update_attributes(params[:project]) 
    flash[:notice] = 'Project was successfully updated.' 
    redirect_to user_projects_path(@user) 
    else 
    render :edit 
    end 
end 

49行是調用update_attributes

其他信息

project.rb

belongs_to :user 
belongs_to :course 

attr_accessible :course_id, :course_attributes 
accepts_nested_attributes_for :course 

course.rb

belongs_to :user 
has_many :projects 

user.rb

has_many :projects 
has_many :courses 

所以一個項目在數據庫中有一個course_id。我目前正在創建或選擇項目#新頁面上的現有課程。這是我的表格。我使用JavaScript切換在collection_select和兩個text_fields之間切換。

項目/ new.html.haml

= form_for [@user, @project] do |f| 
    # This is shown by default 
    = f.collection_select :course_id, @courses, :id, :name, { prompt: true } 

    .hidden # This is hidden by default and shown using a toggle 
    = f.fields_for :course do |builder| 
     = builder.text_field :name, class: 'large', placeholder: 'Ex: Calculus I' 
     = builder.label :number, 'Number' 
     = builder.text_field :number, class: 'new_project_course_number' 
     = builder.hidden_field :user_id, value: current_user.id 

現在,如果我是新的項目頁面上,並通過選擇一個現有當然,我將其連接到一門課程,它會正常工作。將創建項目,並且course_id將被正確設置。

如果我是新的項目頁面上,我創建使用我的JavaScript切換一個療程,然後填寫課程名稱課程編號,然後單擊創建,那麼它也將正常工作。課程將創建,項目將使用正確的course_id創建。

對不起,這篇冗長的文章,但我想提供的所有信息,我可以。謝謝!

UPDATE 1個

路由。RB

resources :users do 
    resources :projects do 
    collection do 
     get 'completed' 
     match 'course/:course_number' => 'projects#course', as: 'course' 
    end 
    end 

    resources :courses 
end 
+0

只是一個提示:最好將問題描述移動到帖子的頭部,以便其餘問題在問題的上下文中進行閱讀。 –

+0

不是一個壞主意,我只是不斷寫作和寫作,哈哈。我把它移動了一些。謝謝@Sergio。 – ardavis

回答

3

假設你Projects#edit形式類同您Projects#new

這在PARAMS創建course_attributes

.hidden # This is hidden by default and shown using a toggle 
    = f.fields_for :course do |builder| 
     = builder.text_field :name, class: 'large', placeholder: 'Ex: Calculus I' 
     = builder.label :number, 'Number' 
     = builder.text_field :number, class: 'new_project_course_number' 
     = builder.hidden_field :user_id, value: current_user.id 

這是因爲如果user有當前的課程,它會爲每門課程創建字段。

如果你希望能夠建立在飛新課程editnew改變這一行:

= f.fields_for :course, @project.build_course(:user => @user) do |builder| 

這將建立一個新的course無論你是在編輯或新。 (您也可以通過這種方式在您的控制器中刪除@project.build_course)。

+0

謝謝您的迴應。在明天之前(從現在起22小時),我不會讓你賞賜你的賞金。我一定會這樣做:) 而不是':user => @ user',我只是使用':user_id => @ user.id'。但更具體地說,它不適用於自定義設置器,我只是將它遺留下來,並且它默認工作。關於這個的想法? – ardavis

+0

另外,如果有人想出一種不同的方式,賞金將會採用哪種方法似乎是最好的。但是讓我知道你爲什麼不能使用自定義設置器的想法。當我嘗試時,它找不到「」的course_id。參數是空白的。 – ardavis

+0

是的,這是因爲'course_id'是一個數據庫字段。我一直在思考,對不起,我會解決這個問題。但我不知道爲什麼這個參數被通過爲「」,這有點奇怪。 – Azolo

0

你不列出你的路線,但假設是正確設置,那麼ProjectsController更新應該能夠做這樣的事情:

@course = Course.find(params[:course_id]) 
+0

因此,即使我設置了一個'@ course'實例變量,它如何幫助調用@ project.update_attributes'? – ardavis

+0

更新代碼以反映我的路線。請參閱更新1 – ardavis