1

这是我的问题。如果我去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

用户.rb

has_many :projects
has_many :courses

所以一个项目在数据库中有一个 course_id。我目前正在 Projects#new 页面上动态创建或选择现有课程。这是我的表格。我使用 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
4

2 回答 2

3

假设您的表格与您的Projects#edit表格相似Projects#new

这是创建course_attributesin 参数

  .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

这是因为如果 auser有当前课程,它将为每门课程创建字段。

如果您希望能够即时构建新课程edit并将new此行更改为:

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

course无论您是处于编辑状态还是新建状态,这都会构建一个新的。(您也可以通过这种方式在控制器中删除@project.build_course。)

于 2012-01-26T18:05:43.780 回答
0

您没有列出您的路线,但假设设置正确,那么 ProjectsController 更新应该能够执行以下操作:

@course = Course.find(params[:course_id])
于 2012-01-24T11:43:23.707 回答