這是我的問題。如果我去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
只是一個提示:最好將問題描述移動到帖子的頭部,以便其餘問題在問題的上下文中進行閱讀。 –
不是一個壞主意,我只是不斷寫作和寫作,哈哈。我把它移動了一些。謝謝@Sergio。 – ardavis