假设我有这种关联:
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
答案 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)。