从嵌套资源为新操作方法创建新对象

时间:2011-10-21 04:24:35

标签: ruby-on-rails

假设我有这种关联:

class User < ActiveRecord :: Base
  has_one :car
end
class Car < ActiveRecord :: Base
  belongs_to :user
end

路线:

resources :users do
  resources :cars
end

那么CarsController中的'new'action方法中的代码是什么

class CarsController < ApplicationController

  def new
    #??? what's necessary to be put here, 
    # if I have request 'localhost:3000/users/1/cars/new'
  end
  ...
end

Rails会自动找出所有内容,所以我不必在'new'方法中编写任何代码吗?此外,由于'new'动作将生成'form_for(@ car)'表单助手,如何创建此car对象

这是对的吗?

class CarsController < ApplicationController
  def new
    @user = User.find(params[:user_id])
    @car = @user.build_car({})
  end
end

2 个答案:

答案 0 :(得分:0)

看起来很好。 Rails将自动执行任何操作。如果你愿意,那里有宝石可以自动化其中的一些,但是陪审团还在考虑他们是否真的值得你花时间。

如果您没有传递给汽车的参数,顺便说一句,您可以在没有参数的情况下运行@user.build_car。您还需要在form_for帮助中明确说明您将汽车嵌套在用户下:form_for [@user, @car]否则表单的目标将是/cars而不是/user/1/cars

答案 1 :(得分:0)

你很亲密,狒狒。我实际上会这样做:

class UsersController < ApplicationController
  def new
    @user = User.new
    @car = @user.cars.build
  end
end

但如果您不想与用户同时创建Car,请尝试:

class CarsController < ApplicationController
  def new
    @user = User.find(params[:user_id])
    @car = @user.cars.build
  end
end

我发现在执行此类操作时,nested_form railscast非常有用。事实上,我认为你可能会从中获得很多(并使用nested_form gem)。

railscasts_196-nested-model-form-part-1