Базовый шаблон Rails для привязки моделей к родителям (вложение?) - PullRequest
0 голосов
/ 17 декабря 2010

Я новичок в Rails и пытаюсь понять, как мы строим «сложные» модели (и их ассоциации), используя инструменты, доступные нам в Rails.Быстро представьте следующий пример сценария: Users являются участником ОДНОЙ гонки Team.Пользователи могут создавать Cars и Schedules.Эти автомобили имеют уровни Drivers, Fuel, Engines и Wheels.Эти Wheels имеют Tires, Hubs и MilesDriven.Вы понимаете ...

Учитывая все предупреждения о вложенности только на 1 уровень глубины ... Я все еще борюсь с тем, как быть RESTful и Rails-y, и представить пользовательский интерфейс, который позволяетпользователь, чтобы построить Car с Tires.

Я знаю, что в нашем распоряжении есть Session & Cookie, а также скрытые поля.Таким образом, пользователь входит в систему ... и перенаправляется на страницу своей команды teams(current_user.team_id).Затем они хотят создать Car.это маршруты к new_team_car_path(current_user.team_id), где они могут построить машину ... теперь я хочу добавить Колесо к этой машине ... так что же, этот маршрут к new_team_car_wheel_path(current_user.team_id, car_id), и т. д. и т. д ...?Я думаю, что нет ... Но что такое Rail-y?

Кроме того, поскольку все построенное будет связано, в конечном счете, с командой (и пользователем), лучше всего «нести» team_id и / или user_id связь вплоть до Tire или разумно ли запрашивать Team, следуя за связями вверх по иерархии во время выполнения?

IЯ уверен, что это базовые вещи, но новизна меня смущает, как лучше всего к ней подойти ...

1 Ответ

1 голос
/ 17 декабря 2010

На этот вопрос нет однозначного ответа. Вы упомянули использование переменных сеанса и скрытых полей - это жизнеспособные подходы, и решение должно быть основано на конкретных требованиях. Тот факт, что вы изо всех сил пытаетесь найти лучший ответ, является хорошим признаком, поскольку показывает, что вы готовы рассмотреть альтернативы.

В этом случае вы имеете дело с тем, что вам не нужно передавать информацию о пользователе или ее ассоциации в URL-адресе, поскольку ваш код авторизации уже делает ее доступной в контроллере. Поэтому я бы удалил идентификатор пользователя и команды из ваших параметров и получил бы к ним доступ current_user:

# GET / автомобили /: car_id / колеса / новые

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

и

# POST / cars /: car_id / wheel

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

Единственная проблема заключается в том, что вам нужно разрешить пользователю доступ к другому пользователю Car. В этом случае должно работать скрытое поле формы (или выпадающее меню) для выбора пользователя. И наоборот, вам может потребоваться проверка авторизации, чтобы пользователи не могли получить доступ к "Car" друг другу

.
...