scaffold rails что это

Rails custom Scaffolding

scaffold rails что это. Смотреть фото scaffold rails что это. Смотреть картинку scaffold rails что это. Картинка про scaffold rails что это. Фото scaffold rails что это
Наверное каждый в начале работы с ROR был впечатлен возможностью Scaffolding’а, который позволяет одной командой создавать migrations, controllers, models и views.

Но что делать если в своем проекте вы используете не стандартные Rails утилиты: erb, Test::Unit, fixturies, а сторонние инструменты: Haml, Rspec, Cucumber, Factory Girl и более того, хотите добавить собственные шаблоны?

Интересно? GOTO next line.

Исходные данные:
Ruby on Rails; Rspec; will-paginate; Haml; Factory-girl

Для начала коротко о Scaffold. Scaffold — это встроенный генератор, сам по себе он ничего не генерирует, но запускает другие генераторы.

Генераторы настраиваются с помощью файла RAILS_ROOT/config/application.rb, внутри которого можно задавать параметры с помощью такой конструкции:

CUSTOM CONTROLLERS

Скопируем шаблон controller.rb из GEMS_PATH/railties[version]/lib/rails/generators/rails/scaffold_controller/templates в RAILS_ROOT/lib/templates/rails/scaffold_controller/controller.rb

Немного кастомиризуем его, добавив поддержку русского языка, паджинацию и обрезав лишний текст

После работы scaffold мы получим такой миловидный код

CUSTOM MODELS

Скопируем файл шаблона model.rb с GEMS_PATH/activerecord[version]/lib/rails/generators/active_record/model/templates в RAILS_ROOT/lib/templates/active_record/model/model.rb

Добавим поддержку русского языка и 2 параметра для will_paginate

На выходе получаем:

CUSTOM VIEWS

И запускаем bundle install

Готово! Теперь рельсогенератор делает file_name.html.haml файлы для нас

Перейдём к нашим шаблонам. Скопируем 5 файлов (edit.html.haml, _form.html.haml, index.html.haml, new.html.haml, show.html.haml) из GEMS_PATH/haml-rails[version]/lib/generators/haml/scaffold/templates в уже полюбившуюся нам RAILS_ROOT/lib/templates/haml/scaffold

Не буду приводить здесь кода, его можно посмотреть по ссылкам ниже

Исходные шаблоны — haml-rails
Шаблон после редактирования — ссылка
Результат — ссылка

RSPEC

Как и в случае с haml, для замены стандартных тестов RSpec’овскими достаточно установить gem «rspec-rails».

По умолчанию scaffold будет создавать rspec файлы для тестирования моделей, контроллеров, хелперов, вьюх, роутинга и запросов.

Наверняка вам как и мне не нужно столько rspec файлов, к счастью ROR позволяет нам настроить этот пункт.

FACTORY GIRL

Для добавления scaffolding для FG, установим gem «rails3-generators»
И добавим в конфиг следующую строчку

Помимо factory_girls гем «rails3-generators» добавляет генераторы для DataMapper, Authlogic, Mongomapper, Shoulda, Formtastic и SimpleForm

Что же у нас получилось?

% rails g scaffold final final:string

Собственные шаблоны для MVC; haml view’s; factory_girl factories; RSpec’s для моделей и контроллеров; встроенная паджинация.

Источник

What is Scaffolding in Ruby on Rails?

You may be learning Rails & you read that you have to create a “scaffold” to get your Rails application started…

You can do this using the rails g scaffold command.

But what is scaffolding?

“Scaffolding is a temporary structure used to support a work crew to aid in the construction, maintenance and repair of buildings, bridges and all other man-made structures.” – Wikipedia

Translated into Rails:

A scaffold is a set of automatically generated files which forms the basic structure of a Rails project.

These files include:

And a migration to prepare your database.

Let’s see an example!

How to Use The Rails Scaffold Command

An example of scaffolding a project for a website about books would look like this.

You should see a lot of text scrolling by, which details the files being created.

This example creates:

That’s a lot of stuff.

If you want to undo this scaffolding, right after creating it, you can use the following command.

Where “d” means “destroy”.

Keep in mind that this will DELETE the files created by the scaffolding process.

Before you can use your scaffolded code you have to run your migrations to update your database schema.

Use the rails db:migrate command.

If no error messages show up, you’re ready! You have a basic structure for your new Rails application, or for a new feature that needs a new model, views & corresponding controller.

Next:

Open your browser to localhost:3000/books & you should be able to see the results!

Rails Scaffolding With Extra Fields

Your model only gets timestamp fields, which means that the only information that you can record about your books (or whatever model you’re working with) is the time at which they were created, or updated.

Here’s how to scaffold with extra fields:

If you generate your scaffolding like this, you’ll have 3 fields to work with.

A title, an author, and a publication year.

That’s a bit more interesting than just having the database timestamps.

Generating Specific Components

Scaffolding creates things you may not need or want right now.

You can create individual components, like controllers, using the rails g (g for generate) command.

Examples:

One of the big benefits of using a scaffolding command is that all the files are created using the correct naming conventions, which avoids strange error messages. It also saves you the work of having to manually create these files.

It’s considered good practice to delete auto-generated files that you don’t plan on using. So after using a generator like “g controller”, review the list of files created & remove those that you don’t need.

Summary

You’ve learned about scaffolding in Ruby so you can quickly jumpstart a new Rails application to practice with.

As you learn more you may want to let go of scaffolding.

But you can still generate individual controllers, models, or view files when you need them.

Источник

Scaffold rails что это

С чего начать?

Модели

Контроллеры

Другие компоненты

Копаем глубже

Копаем глубже

Расширяем Rails

Вносим вклад в Ruby on Rails

Заметки о релизах

Принимаем пожелания и пул-реквесты!

1. Основы командной строки

1.1. rails new
1.2. bin/rails server
1.3. bin/rails generate
1.4. bin/rails console
1.4.1. Объекты app и helper
1.5. bin/rails dbconsole
1.6. bin/rails runner
1.7. bin/rails destroy
1.8. bin/rails about
1.9. bin/rails assets:
1.10. bin/rails db:
1.11. bin/rails notes
1.11.1. Аннотации
1.11.2. Теги
1.11.3. Директории
1.11.4. Расширения
1.12. bin/rails routes
1.13. bin/rails test
1.14. bin/rails tmp:
1.15. Прочее
1.16. Пользовательские задачи Rake

2. Продвинутая командная строка Rails

2.1. Rails с базами данными и SCM

Командная строка Rails

После прочтения этого руководства, вы узнаете

Этот самоучитель предполагает, что вы обладаете знаниями основ Rails, которые можно почерпнуть в руководстве Rails для начинающих.

1. Основы командной строки

Имеется несколько команд, абсолютно критичных для повседневного использования в Rails. В порядке возможной частоты использования, они следующие:

Давайте создадим простое приложение на Rails, чтобы рассмотреть все эти команды в контексте.

1.1. rails new

Сперва мы хотим создать новое приложение на Rails, запустив команду rails new после установки Rails.

Rails создаст кучу всего с помощью такой маленькой команды! Теперь вы получили готовую структуру директории Rails со всем кодом, необходимым для запуска нашего простого приложения.

Если хотите пропустить какие-то файлы или компоненты при генерации, можно добавить следующие аргументы к команде rails new :

1.2. bin/rails server

Команда bin/rails server запускает веб-сервер Puma, поставляемый с Ruby. Его будем использовать всякий раз, когда захотим увидеть свою работу в веб-браузере.

Безо всякого принуждения, bin/rails server запустит наше блестящее приложение на Rails:

Всего лишь тремя командами мы развернули сервер Rails, прослушивающий порт 3000. Перейдите в браузер и зайдите на http://localhost:3000, вы увидите простое приложение, запущенное на rails.

1.3. bin/rails generate

Команда bin/rails generate использует шаблоны для создания целой кучи вещей. Запуск bin/rails generate выдаст список доступных генераторов:

Можно установить больше генераторов с помощью гемов генераторов, части плагинов, которые вы, несомненно, установите, и даже можете создать свой собственный!

Давайте создадим свой собственный контроллер с помощью генератора контроллера. Какую же команду использовать? Давайте спросим у генератора:

Что это сгенерировало? Создался ряд директорий в нашем приложении, и создались файл контроллера, файл вью, файл функционального теста, хелпер для вью, файл JavaScript и файл таблицы стилей.

Давайте проверим контроллер и немного его модифицируем (в app/controllers/greetings_controller.rb ):

Затем вью для отображения нашего сообщения (в app/views/greetings/hello.html.erb ):

В нормальном старом добром приложении Rails, ваши URL будут создаваться по образцу http://(host)/(controller)/(action), и URL, подобный такому http://(host)/(controller), вызовет экшн index этого контроллера.

В Rails также есть генератор для моделей данных.

Давайте настроим простой ресурс, названный «HighScore», который будет отслеживать наши лучшие результаты в видеоиграх, в которые мы играли.

Генератор проверил, что существуют директории для моделей, контроллеров, хелперов, макетов, функциональных и юнит-тестов, таблиц стилей, создал вью, контроллер, модель и миграцию базы данных для HighScore (создающую таблицу high_scores и поля), позаботился о маршруте для ресурса, и создал новые тесты для всего этого.

Давайте взглянем на интерфейс, который Rails создал для нас.

Перейдите в браузер и откройте http://localhost:3000/high_scores, теперь мы можем создать новый рекорд (55,160 в Space Invaders!)

1.4. bin/rails console

Команда console позволяет взаимодействовать с приложением на Rails из командной строки. В своей основе bin/rails console использует IRB, поэтому, если вы когда-либо его использовали, то будете чувствовать себя уютно. Это полезно для тестирования быстрых идей с кодом и правки данных на сервере не трогая веб-сайт.

1.4.1. Объекты app и helper

С помощью метода app доступны хелперы именованных маршрутов, а также можно делать запросы.

С помощью метода helper возможно получить доступ к хелперам Rails и вашего приложения.

1.5. bin/rails dbconsole

bin/rails dbconsole определяет, какая база данных используется, и перемещает вас в такой интерфейс командной строки, в котором можно ее использовать (и также определяет параметры командной строки, которые нужно передать!). Она поддерживает MySQL (включая MariaDB), PostgreSQL и SQLite3.

1.6. bin/rails runner

runner запускает код Ruby в контексте неинтерактивности Rails. Для примера:

С помощью runner даже можно выполнять код ruby, написанный в файле.

1.7. bin/rails destroy

1.8. bin/rails about

bin/rails about предоставляет информацию о номерах версий Ruby, RubyGems, Rails, подкомпонентов Rails, папке вашего приложения, имени текущей среды Rails, адаптере базы данных вашего приложения и версии схемы. Это полезно, когда нужно попросить помощь, проверить патч безопасности, который может повлиять на вас, или просто хотите узнать статистику о текущей инсталляции Rails.

1.9. bin/rails assets:

1.10. bin/rails db:

Более подробно о миграциях написано в руководстве Миграции Active Record.

1.11. bin/rails notes

1.11.1. Аннотации
1.11.2. Теги
1.11.3. Директории
1.11.4. Расширения

1.12. bin/rails routes

bin/rails routes отобразит список всех определенных маршрутов, что полезно для отслеживания проблем с роутингом в вашем приложении, или предоставления хорошего обзора URL приложения, с которым вы пытаетесь ознакомиться.

1.13. bin/rails test

Хорошее описание юнит-тестирования в Rails дано в руководстве Тестирование приложений на Rails.

1.14. bin/rails tmp:

Директория Rails.root/tmp является, как любая *nix директория /tmp, местом для временных файлов, таких как файлы id процессов и кэшированные экшны.

Команды пространства имен tmp: помогут очистить и создать директорию Rails.root/tmp :

1.15. Прочее

1.16. Пользовательские задачи Rake

Чтобы передать аргументы в ваш задачу rake:

Задачи можно группировать, помещая их в пространства имен:

Вызов задач выглядит так:

2. Продвинутая командная строка Rails

Более продвинутое использование командной строки сфокусировано на полезных (даже иногда удивляющих) опциях утилит, и подгонке утилит к вашим потребностям и особенностям рабочего процесса. Сейчас мы перечислим трюки из рукава Rails.

2.1. Rails с базами данными и SCM

При создании нового приложения на Rails, можно выбрать, какой тип базы данных и какой тип системы управления исходным кодом (SCM) собирается использовать ваше приложение. Это сэкономит вам несколько минут и, конечно, несколько строк.

Мы создали директорию gitapp и инициализировали пустой репозиторий перед тем, как Rails добавил бы созданные им файлы в наш репозиторий. Давайте взглянем, что он нам поместил в конфигурацию базы данных:

Единственная хитрость с использованием опции SCM состоит в том, что сначала нужно создать директорию для приложения, затем инициализировать ваш SCM, и лишь затем можно запустить команду rails new для генерация основы вашего приложения.

scaffold rails что это. Смотреть фото scaffold rails что это. Смотреть картинку scaffold rails что это. Картинка про scaffold rails что это. Фото scaffold rails что это scaffold rails что это. Смотреть фото scaffold rails что это. Смотреть картинку scaffold rails что это. Картинка про scaffold rails что это. Фото scaffold rails что это

Источник

Guides.rubyonrails.org

The Rails Command Line

After reading this guide, you will know:

Chapters

This tutorial assumes you have basic Rails knowledge from reading the Getting Started with Rails Guide.

1 Command Line Basics

There are a few commands that are absolutely critical to your everyday usage of Rails. In the order of how much you’ll probably use them are:

Let’s create a simple Rails application to step through each of these commands in context.

1.1 rails new

The first thing we’ll want to do is create a new Rails application by running the rails new command after installing Rails.

Rails will set you up with what seems like a huge amount of stuff for such a tiny command! You’ve got the entire Rails directory structure now with all the code you need to run our simple application right out of the box.

If you wish to skip some files or components from being generated, you can append the following arguments to your rails new command:

1.2 bin/rails server

The bin/rails server command launches a web server named Puma which comes bundled with Rails. You’ll use this any time you want to access your application through a web browser.

With no further work, bin/rails server will run our new shiny Rails app:

With just three commands we whipped up a Rails server listening on port 3000. Go to your browser and open http://localhost:3000, you will see a basic Rails app running.

1.3 bin/rails generate

The bin/rails generate command uses templates to create a whole lot of things. Running bin/rails generate by itself gives a list of available generators:

You can install more generators through generator gems, portions of plugins you’ll undoubtedly install, and you can even create your own!

Using generators will save you a large amount of time by writing boilerplate code, code that is necessary for the app to work.

Let’s make our own controller with the controller generator. But what command should we use? Let’s ask the generator:

What all did this generate? It made sure a bunch of directories were in our application, and created a controller file, a view file, a functional test file, a helper for the view, a JavaScript file, and a stylesheet file.

Check out the controller and modify it a little (in app/controllers/greetings_controller.rb ):

Then the view, to display our message (in app/views/greetings/hello.html.erb ):

With a normal, plain-old Rails application, your URLs will generally follow the pattern of http://(host)/(controller)/(action), and a URL like http://(host)/(controller) will hit the index action of that controller.

Rails comes with a generator for data models too.

For a list of available field types for the type parameter, refer to the API documentation for the add_column method for the SchemaStatements module. The index parameter generates a corresponding index for the column.

But instead of generating a model directly (which we’ll be doing later), let’s set up a scaffold. A scaffold in Rails is a full set of model, database migration for that model, controller to manipulate it, views to view and manipulate the data, and a test suite for each of the above.

We will set up a simple resource called «HighScore» that will keep track of our highest score on video games we play.

The generator checks that there exist the directories for models, controllers, helpers, layouts, functional and unit tests, stylesheets, creates the views, controller, model and database migration for HighScore (creating the high_scores table and fields), takes care of the route for the resource, and new tests for everything.

The migration requires that we migrate, that is, run some Ruby code (living in that 20130717151933_create_high_scores.rb ) to modify the schema of our database. Which database? The SQLite3 database that Rails will create for you when we run the bin/rails db:migrate command. We’ll talk more about that command below.

Let’s talk about unit tests. Unit tests are code that tests and makes assertions about code. In unit testing, we take a little part of code, say a method of a model, and test its inputs and outputs. Unit tests are your friend. The sooner you make peace with the fact that your quality of life will drastically increase when you unit test your code, the better. Seriously. Please visit the testing guide for an in-depth look at unit testing.

Let’s see the interface Rails created for us.

Go to your browser and open http://localhost:3000/high_scores, now we can create new high scores (55,160 on Space Invaders!)

1.4 bin/rails console

The console command lets you interact with your Rails application from the command line. On the underside, bin/rails console uses IRB, so if you’ve ever used it, you’ll be right at home. This is useful for testing out quick ideas with code and changing data server-side without touching the website.

You can specify the environment in which the console command should operate.

1.4.1 The app and helper objects

Inside the bin/rails console you have access to the app and helper instances.

With the app method you can access named route helpers, as well as do requests.

With the helper method it is possible to access Rails and your application’s helpers.

1.5 bin/rails dbconsole

bin/rails dbconsole figures out which database you’re using and drops you into whichever command line interface you would use with it (and figures out the command line parameters to give to it, too!). It supports MySQL (including MariaDB), PostgreSQL, and SQLite3.

1.6 bin/rails runner

runner runs Ruby code in the context of Rails non-interactively. For instance:

You can even execute ruby code written in a file with runner.

1.7 bin/rails destroy

1.8 bin/rails about

bin/rails about gives information about version numbers for Ruby, RubyGems, Rails, the Rails subcomponents, your application’s folder, the current Rails environment name, your app’s database adapter, and schema version. It is useful when you need to ask for help, check if a security patch might affect you, or when you need some stats for an existing Rails installation.

1.9 bin/rails assets:

1.10 bin/rails db:

More information about migrations can be found in the Migrations guide.

1.11 bin/rails notes

1.11.1 Annotations
1.11.2 Tags
1.11.3 Directories
1.11.4 Extensions

1.12 bin/rails routes

bin/rails routes will list all of your defined routes, which is useful for tracking down routing problems in your app, or giving you a good overview of the URLs in an app you’re trying to get familiar with.

1.13 bin/rails test

A good description of unit testing in Rails is given in A Guide to Testing Rails Applications

Rails comes with a test framework called minitest. Rails owes its stability to the use of tests. The commands available in the test: namespace helps in running the different tests you will hopefully write.

1.14 bin/rails tmp:

The Rails.root/tmp directory is, like the *nix /tmp directory, the holding place for temporary files like process id files and cached actions.

The tmp: namespaced commands will help you clear and create the Rails.root/tmp directory:

1.15 Miscellaneous

1.16 Custom Rake Tasks

To pass arguments to your custom rake task:

You can group tasks by placing them in namespaces:

Invocation of the tasks will look like:

If you need to interact with your application models, perform database queries, and so on, your task should depend on the environment task, which will load your application code.

2 The Rails Advanced Command Line

More advanced use of the command line is focused around finding useful (even surprising at times) options in the utilities, and fitting those to your needs and specific work flow. Listed here are some tricks up Rails’ sleeve.

2.1 Rails with Databases and SCM

When creating a new Rails application, you have the option to specify what kind of database and what kind of source code management system your application is going to use. This will save you a few minutes, and certainly many keystrokes.

We had to create the gitapp directory and initialize an empty git repository before Rails would add files it created to our repository. Let’s see what it put in our database configuration:

It also generated some lines in our database.yml configuration corresponding to our choice of PostgreSQL for database.

The only catch with using the SCM options is that you have to make your application’s directory first, then initialize your SCM, then you can run the rails new command to generate the basis of your app.

Feedback

You’re encouraged to help improve the quality of this guide.

Please contribute if you see any typos or factual errors. To get started, you can read our documentation contributions section.

You may also find incomplete content or stuff that is not up to date. Please do add any missing documentation for main. Make sure to check Edge Guides first to verify if the issues are already fixed or not on the main branch. Check the Ruby on Rails Guides Guidelines for style and conventions.

If for whatever reason you spot something to fix but cannot patch it yourself, please open an issue.

And last but not least, any kind of discussion regarding Ruby on Rails documentation is very welcome on the rubyonrails-docs mailing list.

«Rails», «Ruby on Rails», and the Rails logo are trademarks of David Heinemeier Hansson. All rights reserved.

Источник

Создание вложенных ресурсов Ruby on Rails

Ruby on Rails – это фреймворк для веб-приложений, написанный на Ruby, который предлагает разработчикам взвешенный подход к разработке приложений. Работа в Rails дает разработчикам:

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

В этом мануале мы используем существующее приложение Rails – наш пример из мануала Сборка приложения Ruby on Rails. В этом приложении уже есть модель для обработки данных об акулах, а мы добавим вложенный ресурс для постов об отдельных акулах. Это позволит пользователям более широко выстраивать свои мысли и мнения.

Требования

1: Скаффолдинг приложения

Приложение будет использовать связи (или ассоциации) Active Record для построения отношений между моделями Shark и Post: посты будут присвоены определенным акулам, и о каждой акуле может быть несколько постов. То есть модели Shark и Post будут связаны посредством ассоциаций belongs_to и has_many.

Для начала нужно создать модель Post и связанные с ней ресурсы. Для этого мы можем использовать команду rails generate scaffold, которая предоставит нам модель, миграцию базы данных для изменения схемы БД, контроллер, полный набор представлений для управления стандартными операциями CRUD (Create, Read, Update и Delete) и шаблоны для партиалов, хелперов и тестов. Эти ресурсы нуждаются в дополнительной настройке, но команда scaffold сэкономит много времени и сил, поскольку она сгенерирует структуру, которую можно использовать в качестве старта.

Перейдите в каталог sharkapp нашего проекта Rails, который мы создали в предыдущем мануале:

Создайте ресурсы Post с помощью следующей команды:

rails generate scaffold Post body:text shark:references

body: text включает поле body в таблицу базы данных posts – эта таблица связана с моделью Post. Мы также добавили ключевое слово :references, которое устанавливает связь между моделями Shark и Post. Кроме того, оно добавит в базу данных posts внешний ключ, представляющий каждую запись.

После запуска команды вы увидите вывод, подтверждающий, что Rails сгенерировал заданные ресурсы для приложения. Прежде чем двигаться дальше, вы можете проверить файл миграции базы данных и узнать, какие отношения установлены между вашими моделями и таблицами базы данных. Используйте следующую команду, чтобы просмотреть содержимое этого файла (замените метку времени своей меткой):

Вы получите результат:

class CreatePosts t.references :shark, foreign_key: true
t.timestamps
end
end
end

Как видите, в таблице есть столбец для внешнего ключа shark. Этот ключ записывается как model_name_id – в данном случае это shark_id.

Rails установил отношения между моделями и другими частями приложения. Посмотрите на недавно созданную модель Post с помощью следующей команды:

cat app/models/post.rb
class Post

Ассоциация own_to устанавливает связь между моделями, где экземпляр декларируемой модели принадлежит одному экземпляру именованной модели. На примере нашего приложения это означает, что один пост принадлежит одной акуле.

Кроме этого отношения команда rails generate scaffold также создала маршруты и представления для постов (как это было сделано в разделе 3 мануала Сборка приложения Ruby on Rails).

Это хорошее начало, но нам нужно будет настроить дополнительную маршрутизацию и укрепить ассоциацию Active Record для модели Shark, чтобы отношения между моделями и маршрутами работали правильно.

2: Определение вложенных маршрутов и ассоциаций в родительской модели

Rails уже установил в модели Post ассоциацию belongs_to благодаря ключевому слову :references в команде rails generate scaffold. Но чтобы это отношение функционировало должным образом, нужно также указать ассоциацию has_many в модели Shark. Нам также нужно внести изменения в стандартную маршрутизацию, которую предоставил Rails, и сделать ресурсы post дочерними для ресурсов shark.

Чтобы добавить ассоциацию has_many в модель Shark, откройте app/models/shark.rb в nano или другом редакторе:

Добавьте эту строку в файл, чтобы установить отношения между моделями Shark и Post.

class Shark has_many :posts
validates :name, presence: true, uniqueness: true
validates :facts, presence: true
end

Здесь стоит подумать о том, что происходит с постами после удаления конкретной акулы. Скорее всего, посты, связанные с удаленной акулой, больше не понадобятся и не должны сохраняться в базе данных. Чтобы все посты, связанные с удаленной акулой, тоже удалялись, мы можем включить в ассоциацию параметр dependent.

Для этого добавьте следующий код в файл:

class Shark dependent: :destroy
validates :name, presence: true, uniqueness: true
validates :facts, presence: true
end

Сохраните и закройте файл. Если вы используете nano, нажмите Ctrl + X, Y, затем Enter.

Затем откройте файл config/rout.rb, чтобы изменить отношения между resourceful маршрутами:

В настоящее время файл выглядит так:

Rails.application.routes.draw do
resources :posts
resources :sharks
root ‘sharks#index’
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

Текущий код устанавливает независимые отношения между маршрутами, при этом выражая зависимости между акулами и связанными с ними постами.

Давайте обновим декларацию маршрута, сделав :sharks родителем :posts. Обновите код в файле, чтобы он выглядел следующим образом:

Rails.application.routes.draw do
resources : sharks do
resources : posts
end
root ‘sharks#index’
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

Сохраните и закройте файл.

Теперь нужно обновить контроллер posts.

3: Обновление контроллера posts

Связь между моделями дает нам методы, которые можно использовать для создания новых экземпляров постов, связанных с конкретными акулами. Чтобы использовать эти методы, нужно добавить их в контроллер posts.

Откройте файл контроллера:

В настоящее время файл выглядит так:

Как и в контроллере sharks, методы этого контроллера работают с экземплярами связанного класса Post. Например, метод new создает новый экземпляр класса Post, метод index захватывает все экземпляры класса, а метод set_post использует find и params для выбора определенного сообщения по id. Однако если мы хотим, чтобы экземпляры постов были связаны с конкретными экземплярами акул, нам нужно изменить этот код, поскольку класс Post в настоящее время работает как независимый объект.

Для изменений мы будем использовать 2 вещи:

Начнем с написания метода get_shark, который будет запускаться перед каждым действием в контроллере. Этот метод создаст локальную переменную экземпляра @shark, найдя его по shark_id. Имея эту переменную в файле, мы сможем связать посты с определенной акулой в других методах.

Перед методами private внизу файла добавьте следующий метод:

Затем в начале файла добавьте фильтр (поместите его перед существующим фильтром):

class PostsController before_action :get_shark

Это обеспечит запуск get_shark перед каждым действием, определенным в файле.

Затем можно использовать этот экземпляр @shark, чтобы переписать метод index. Вместо того чтобы захватывать все экземпляры класса Post этот метод будет возвращать все экземпляры post, связанные с конкретным экземпляром shark.

Измените метод index, чтобы он выглядел так:

Метод new нужно также пересмотреть, чтобы он мог связывать новый экземпляр поста с конкретной акулой. Чтобы достичь этого, мы можем использовать метод build вместе с локальной переменной экземпляра @shark.

Измените метод new, чтобы он выглядел так:

Этот метод создает объект post, связанный с конкретным экземпляром shark из метода get_shark.

Далее мы рассмотрим метод, который наиболее тесно связан с new – это метод create. Он делает две вещи: создает новый экземпляр post на основе параметров, введенных пользователями в форму new, а затем сохраняет этот экземпляр (если ошибок нет) и использует хелпера маршрутизации, чтобы перенаправить пользователей туда, где они смогут видеть новый пост. В случае ошибки он снова отображает шаблон new.

Обновите метод create, чтобы он выглядел так:

Далее взглянем на метод update. Этот метод использует переменную экземпляра @post, которая в самом методе не установлена ​​явно. Откуда берется эта переменная?

Посмотрите на фильтры в верхней части файла. Второй, автоматически сгенерированный фильтр before_action ответит на этот вопрос:

Метод update (например, show, edit и destroy) берет переменную @post из метода set_post. Этот метод, указанный в методе get_shark вместе с другими методами private, в настоящее время выглядит следующим образом:

В соответствии с методами, которые мы использовали в другом месте файла, нам нужно изменить этот метод так, чтобы @post ссылалась на конкретный экземпляр в коллекции постов, связанных с конкретной акулой. Здесь нужно помнить о методе build – благодаря ассоциациям между моделями и методам (типа build), которые стали доступны благодаря этим ассоциациям, каждый экземпляр post является частью набора объектов, связанных с конкретной акулой. Поэтому при запросе определенного поста имеет смысл запрашивать коллекцию постов, связанных с определенной акулой.

Обновите set_post так:

Вместо того чтобы искать конкретный экземпляр всего класса Post по id, мы ищем соответствующий id в коллекции постов, связанных с конкретной акулой.

Обновив этот метод, можем перейти к методам update и destroy.

Метод update берет переменную экземпляра @post из set_post и использует ее с post_params, которые пользователь ввел в форму edit. Если все сделано правильно, Rails должен отправить пользователя обратно в представление

index для постов, связанных с определенной акулой. В случае ошибки Rails снова отобразит шаблон edit.

В этом случае единственное изменение, которое нам нужно сделать, – это оператор redirect_to, предназначенный для обработки успешных обновлений. Он должен перенаправляться на shark_post_path(@shark), который будет перенаправлять на представление index для выбранной акулы:

Далее мы внесем аналогичное изменение в метод destroy. Обновите метод redirect_to для перенаправления запросов в shark_posts_path(@shark) в случае успешного обновления:

Это последнее изменение, которое нужно внести в данный файл. Теперь файл posts_controller выглядит следующим образом:

Контроллер управляет передачей информации из шаблонов представления в базу данных и наоборот. Теперь он отражает отношения между моделями Shark и Post, в которых посты связаны с определенными акулами. Мы можем перейти к редактированию шаблонов представления, с помощью которых пользователи будут изменять посты об определенных акулах.

4: Обновление видов

Сейчас нам нужно изменить шаблоны, относящиеся к постам, а также представления show для акул (чтобы пользователи видели посты, связанные с конкретными акулами).

Давайте начнем с основного шаблона для постов – с партиала form, который повторно используется в нескольких шаблонах постов. Откройте его:

Мы не будем передавать хелперу формы form_with не только модель post, а обе модели shark и post, при этом post будет задан как дочерний ресурс.

Измените первую строку файла следующим образом, чтобы отразить отношения между ресурсами shark и post:

Затем удалите раздел, в котором указан shark_id связанной акулы, так как эта информация в представлении не нужна.

С учетом правок файл form будет выглядеть так:

prohibited this post from being saved:

Сохраните и закройте файл.

Теперь откройте представление index, которое показывает посты, связанные с определенной акулой.

С помощью команды rails generate scaffold Rails сгенерировал большую часть шаблона вместе с таблицей, которая показывает поле body для каждого поста и связанную с ним shark.

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

В теле таблицы внесите следующие обновления.

Во-первых, измените post.shark на post.shark.name, чтобы таблица включала поле для названия акулы (вместо идентифицирующей информации о самом объекте):

Затем измените перенаправление Show, чтобы направить пользователей в представление show нужной акулы (если они захотят вернуться к исходной акуле). Здесь можно использовать переменную экземпляра @shark, которую мы установили в контроллере, поскольку Rails делает переменные экземпляра, созданные в контроллере, доступными для всех представлений. Также давайте изменим текст ссылки: вместо Show будет Show Shark, чтобы пользователи лучше понимали ее функцию.

Затем нужно убедиться, что пользователи перенаправляются по правильному вложенному пути при редактировании постов. То есть вместо posts/post_id/edit пользователи будут перенаправлены на sharks/shark_id/posts/post_id/edit. Для этого мы используем хелпера маршрутизации shark_post_path и модели, которые Rails будет рассматривать как URL-адреса. Мы также обновим текст ссылки, чтобы сделать его функцию более понятной.

После обновления строка Edit будет выглядеть следующим образом:

Далее нужно внести аналогичное изменение в ссылку Destroy, обновить ее функцию в строке и добавить ресурсы shark и post:

Остается только обновить путь к новому посту в нижней части формы, чтобы пользователи могли перейти по соответствующему вложенному пути, когда они захотят создать новый пост. Обновите последнюю строку файла, чтобы использовать хелпер маршрутизации new_shark_post_path (@shark):

В результате файл будет выглядеть так:

Posts

Сохраните и закройте файл, когда закончите редактирование.

Осталось внести не так много изменений. Сейчас другие представления используют партиал form, который мы уже отредактировали. Нужно обновить ссылки link_to в других шаблонах сообщений, чтобы отразить изменения, которые мы внесли в партиал form.

Ссылка link_to в конце файла должна использовать хелпер shark_posts_path(@shark):

Сохраните и закройте файл.

Откройте шаблон edit:

Давайте обновим пути Back и Show, чтобы отразить наши вложенные ресурсы. Измените последние две строки файла, чтобы они выглядели так:

Сохраните и закройте файл.

Далее откройте шаблон show:

Внесите следующие изменения в пути Edit и Back в нижней части файла:

Сохраните и закройте файл, когда закончите.

Теперь осталось только обновить представление show для sharks, чтобы посты отображались отдельно. Откройте этот файл:

Здесь нужно добавить раздел Posts в форму и ссылку Add Post в конце файла.

Под Facts добавьте новый раздел, который будет перебирать каждый экземпляр в коллекции постов, связанных с заданной акулой, выводя тело каждого сообщения.

Добавьте следующий код под разделом Facts и над редиректами в конце файла:

Posts

Затем добавьте новый редирект, чтобы позволить пользователям добавлять новые посты.

Сохраните и закройте файл.

Теперь модели, контроллеры и представления вашего приложения настроены правильно. Давайте добавим пару проверок в модель Post, чтобы обеспечить согласованность данных в БД.

5: Добавление проверок и тестирование приложения

В разделе 5 этого мануала мы добавили проверки в модель Shark, чтобы обеспечить однородность и последовательность данных в БД sharks. Сделаем то же самое для БД posts.

Откройте файл модели Post.

Нужно сделать так, чтобы нельзя было отправить пустой пост или дублировать контент, который могли опубликовать другие пользователи. Для этого добавьте в файл следующую строку:

Сохраните и закройте файл.

Теперь можно запустить миграцию и протестировать приложение.

Сначала запустите миграцию:

Затем запустите свой сервер. Если вы работаете локально, вы можете ввести:

Если вы работаете на удаленной машине, введите:

Перейдите в корневой каталог приложения:

В предыдущем мануале мы добавили и отредактировали запись Great White shark. Если вы не добавляли больше записей, посадочная страница приложения будет выглядеть следующим образом:

Sharks
Name Facts
Great White Large Show Edit Destroy
New Shark

Нажмите на Show рядом с Great White. Это выведет вас на представление show для этой акулы. Вы увидите название акулы и факты о ней, а также заголовок Posts без содержания. Давайте добавим пост, чтобы заполнить эту часть формы.

Нажмите Add Post под заголовком Posts. Это приведет вас к представлению index, где у вас будет возможность выбрать New Post.

Поскольку в разделе 6 предыдущего мануала мы установили механизмы аутентификации, приложение может попросить пройти аутентификацию, указав имя пользователя и пароль (если вы находитесь в новой сессии).

Нажмите New Post, и вы получите шаблон new.

New Post
Body
Create Post
Back

В поле Body введите «These sharks are scary!»

Нажмите Create Post. Вы будете перенаправлены в представление index, где хранятся все посты для этой акулы:

The post was successfully created.
Posts
Body Shark
These sharks are scary! Great White Show Shark Edit Post Destroy Post
New Post

Работая с ресурсами постов, мы можем проверить наши данные и убедиться, что в базу сохраняются только нужные данные.

В представлении index нажмите New Post. В поле Body новой формы попробуйте снова ввести «These sharks are scary!»

Нажмите Create Post. Вы увидите следующую ошибку:

1 error prohibited this post from being saved:
Body has already been taken

Нажмите Back, чтобы вернуться на главную страницу постов.

Чтобы убедиться, что вторая проверка работает, снова нажмите New Post. Оставьте тело поста пустым и нажмите Create Post. Вы увидите следующую ошибку:

1 error prohibited this post from being saved:
Body can’t be blank

Теперь у вас есть работающее приложение Rails с вложенными ресурсами и проверками, которое вы можете использовать в качестве стартового шаблона для дальнейшей разработки.

Заключение

Имея базовое Rails-приложение, вы можете работать над стилями и разработкой других интерфейсных компонентов. Узнать больше о маршрутизации и вложенных ресурсах можно в документации Rails.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *