(Не уверен, что я полностью понял ваш вопрос, не стесняйтесь, дайте мне знать, если это так.)
Модель rails - это в основном класс ruby, который сохраняется в базе данных. Таким образом, он по большей части действует как обычный объект ruby с примесью некоторой магии базы данных.
Вы указываете rails, какой экземпляр проекта загружать (например, предоставляя id
), и он загружает данные из базы данных.
Затем, когда вы вызываете project.tasks
, происходит волшебство: модель Project
не имеет метода tasks
, поэтому она вызовет метод method_missing
Рубина. Затем он загрузит связанные записи в экземпляры модели и предоставит доступ к ним через объект rails.
Поскольку project
имеет много task
s, rails знает, что оно должно заглянуть в базу данных tasks
и загрузить строки, в которых project_id
равен атрибуту id
модели project
.
Короче говоря, возможности рубинового метапрограммирования и исправления обезьян делают возможной большую часть магии рельсов.
(Изменить для вопроса о маршрутизации.)
Когда вы хотите отредактировать проект № 13, вы переходите по URL-адресу, который выглядит примерно так: www.mysite.com/projects/13/edit. Если вы посмотрите на routes.rb
в вашем каталоге config
, вы увидите (в Rails3) resources :projects
, что делает Rails, устанавливает для вас все виды путей. За волшебством путь редактирования выглядит как
get '/projects/:id/edit' => 'projects#edit'
Это в основном говорит: «когда пользователь хочет посмотреть www.mysite.com/projects/13/edit, отправьте его на действие edit
в контроллере projects
и установите для параметра id
значение, которое в этом месте.
Затем в вашем контроллере вы загрузите соответствующий проект с
@project = Project.find(params[:id])
Аналогичным образом вы можете сделать это (это глупый пример):
В routes.rb
, поставить
get '/projects/:id/edit_name/:name' => 'projects#edit'
А потом у тебя контроллер
@project = Project.find(params[:id])
@project.name = params[:name]
Таким образом, rails в основном использует магию для присвоения значений в URL параметрам, с которыми вы можете работать в вашем контроллере. Подробнее о маршрутизации вы можете прочитать здесь: http://guides.rubyonrails.org/routing.html