这是我的问题。如果我转到Projects#edit
,我无法更改分配给它的课程。如果我试图为它创建一个新课程,或从现有课程中进行选择,我会收到以下错误:
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)。
项目控制器
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
。
其他信息
项目.rb
belongs_to :user
belongs_to :course
attr_accessible :course_id, :course_attributes
accepts_nested_attributes_for :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
创建项目。
很抱歉发了这么长的帖子,但我想提供我能提供的所有信息。谢谢
更新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
假设您的Projects#edit
表单与Projects#new
相似
这是在参数中创建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
有一个当前课程,它会为每个课程创建字段。
如果你想在edit
和new
中建立一个新的飞行课程,请将此行更改为:
= f.fields_for :course, @project.build_course(:user => @user) do |builder|
这将构建一个新的course
,无论您是处于编辑状态还是新状态。(您也可以通过这种方式删除控制器中的@project.build_course
。)
您没有列出路线,但假设设置正确,那么ProjectsController更新应该能够执行以下操作:
@course = Course.find(params[:course_id])