Какого рода информацию может получить доступ к Модели в Rails? - PullRequest
1 голос
/ 12 января 2011

В первом эпизоде ​​Райана Бейтса о сложных формах он добавляет к модели следующее:

# models/project.rb
has_many :tasks

def task_attributes=(task_attributes)
  task_attributes.each do |attributes|
    tasks.build(attributes)
  end
end

Я никогда не думал об этом раньше, но как модель Project узнает, какие "задачи" какого экземпляра Project? Это происходит из ассоциации has_many? Это похоже на то, что когда проект запущен, и я просматриваю Проект, это «активный» объект, поэтому project.rb знает, на какой объект Project мы ссылаемся, поэтому он знает, что задачи действительно являются some_current_project.tasks? (Я, очевидно, хватаюсь за соломинку здесь.)

Кроме того, если бы кто-то указал мне какую-то ссылку, которая объясняет другие вопросы, подобные этому, я был бы очень признателен.

Надеюсь, мой вопрос понятен. Пожалуйста, попросите дополнительные разъяснения в комментариях, если это необходимо.

Обратите внимание: я знаю, что Active Record обрабатывает действия CRUD и что объекты соответствуют строкам в таблицах и т. Д. Это всего лишь описания того, что Active Record является . Я ищу, как это работает, когда проект запущен. Я также сейчас создаю MVC, но я не могу найти подробное объяснение того, какая информация отправляется куда в отношении Rails.

1 Ответ

1 голос
/ 12 января 2011

(Не уверен, что я полностью понял ваш вопрос, не стесняйтесь, дайте мне знать, если это так.)

Модель 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...