用于将模型与父项关联的基本Rails模式(嵌套?)

时间:2010-12-17 19:32:02

标签: ruby-on-rails data-modeling restful-url

我是Rails的新手,并试图了解我们如何使用Rails中可用的工具构建“复杂”模型(及其关联)。快速想象以下示例场景:Users是ONE racing Team的成员。用户可以创建CarsSchedules。这些汽车有DriversFuel级别,EnginesWheels。这些WheelsTiresHubsMilesDriven。你明白了......

鉴于所有关于嵌套的警告只有1级深度...我仍然如何成为RESTful和Rails-y并且提供允许用户构建{{1}的UI与Car

我知道我们有Tires&我们可以使用Session以及隐藏的字段。因此,用户登录...并被路由到他们的团队页面Cookie。然后他们想要创建一个teams(current_user.team_id)。这路线到Car,他们可以在那里建车...现在我想给这辆车增加一个轮子......那路由到new_team_car_path(current_user.team_id)等等......?我想不是......但是,Rail-y的方式是什么?

此外,由于构建的所有内容最终会与团队(和用户)相关联,因此最好将“new_team_car_wheel_path(current_user.team_id, car_id)和/或team_id关联”一直“传递”到{ {1}} 通过在运行时跟踪层次结构中的关联来查询user_id是否合理?

我确信这是基本的东西,但是newbness让我对如何最好地接近它感到困惑......

1 个答案:

答案 0 :(得分:1)

这个问题没有一个答案。您提到使用会话变量和隐藏字段 - 这些是可行的方法,并且决策必须基于特定要求。您正在努力寻找最佳答案的事实是一个好兆头,因为它表明您愿意考虑替代方案。

在这种情况下,您需要支持,因为您不需要在URL中传递用户信息或其关联,因为您的授权代码已经使其在控制器中可用。因此,我会从您的参数中删除用户和团队ID,并从current_user

访问它们

#GET / cars /:car_id / wheels / new

def new
  @car = Car.find(params[:car_id])
  @wheel = @car.wheels.build
end

#POST / cars /:car_id / wheels

def create
  @user = current_user
  @team = @user.team
  @car = Car.find(params[:car_id]
  @wheel = @car.wheels.build(params[:car][:wheel])
  ...
end

唯一的问题是,如果您需要允许用户访问其他用户的Car。在这种情况下,选择用户的隐藏表单字段(或下拉菜单)应该有效。相反,您可能需要进行授权检查以防止用户访问彼此的“Car”