Рельсы:Каркас для автоматического установления отношения "один ко многим"
-
20-08-2019 - |
Вопрос
Не уверен, читаю ли я это верно, но похоже, что Scaffold не будет поддерживать отношения "один ко многим" во всей их полноте.Например, если я создам messages
с помощью scaffold, а затем я хочу comments
на тех messages
(один message
-> многие comments
), я должен пройти через это и все изменить.Например, я должен изменить это в comment
's new
Вид
<% form_for(@comment) do |f| %>
к этому
<% form_for([@message, @comment]) do |f| %>
а затем измените Действие, чтобы настроить @message
var...помимо всего прочего.
В настоящее время это не может быть сделано автоматически с помощью Scaffold, не так ли?
Решение
Это правда, но это еще не конец истории.Есть по крайней мере две альтернативы Scaffold, которые оба работают довольно хорошо и автоматически определяют отношения между классами (на основе ваших индикаторов отношений ActiveRecord, таких как has_many).Одной из таких альтернатив является Оптимизированный а другой - это Активный посох.
Они в основном полезны для ввода данных, которые требуются вашей системе и которые не являются данными, введенными пользователем.Например, я использую их для административных задач над таблицами, где нет смысла создавать полный пользовательский интерфейс для CRUD, когда одна из альтернатив scaffold отлично справится с задачей для редко используемой функции.Однако вы бы не хотели использовать их для комментариев к сообщениям.
Другие советы
ДА.Scaffold работает для модели и связанного с ней контроллера.Это не заботится об отношениях и не работает с ними.
Основная цель Scaffold - запустить CRUD в модели с использованием контроллера и связанных представлений.Вот и все.Любое другое требование, такое как отношения, должно быть закодировано вручную.
Обратите внимание, что существуют такие проекты, как Бродяга для Rails, которые позволяют вам сохранять ваши поля и ассоциации внутри самой модели.Вы не можете создавать ассоциации, но это довольно близко.
В конечном итоге вы платите за этот сахар, создавая гораздо больше приложений за вашей спиной.Вместо того чтобы создавать свои собственные, вы обычно вычитаете то, что вам нужно, из большого набора готовых моделей поведения.
Вам не нужна тяжелая платформа администрирования rails, чтобы наладить отношения "один ко многим".
Вы можете использовать строительные леса, чтобы проделать большую часть пути туда.
Еще немного поработав с представлением controller и _form, вы пройдете оставшуюся часть пути.
Вот как...
Story: Select a beer for a developer
In order to select a beer for a developer
As an admin
I want a mainly scaffolded interface to select that beer
Scenario 1: Select beer for new developer
Given I have clicked the <new> button and entered the developer's name
When I click the beer dropdown
Then I should be presented with a list of beers to choose from
And that beer will be saved when I click <ok>
Scenario 2: Select a different beer for existing developer
Given I have clicked the <edit> button on the index page for a particular developer
When I click the beer dropdown
Then I should be presented with a list of beers to choose from
And that beer will be saved when I click <ok>
Предполагая, что у нас есть пиво таблица:
create_table "beers", force: true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
И a Разработчики таблица, имеющая внешний ключ (beer_id), ссылающийся на таблицу beers:
create_table "developers", force: true do |t|
t.string "name"
t.integer "beer_id"
t.datetime "created_at"
t.datetime "updated_at"
end
Мы можем использовать строительные леса для создания обеих таблиц:
$ rails g название пива scaffold
$ rails g scaffold имя разработчика beer_id:целое число
Команда scaffold создает контроллеры и представления для каждой модели.
Нам нужно будет немного модифицировать наши контроллеры и представления, чтобы получить выпадающее меню для выбора пива для каждого разработчика:
приложение/ просмотры / разработчики/_form.html.erb
Замените сгенерированное текстовое поле и метку для beer_id на следующее:
<div class="field">
<%= f.label :beer_id %><br />
<%= collection_select(:developer, :beer_id, @beers, :id, :name, {:prompt => false}) %>
</div>
приложение / контроллеры/developer_controller.rb разработчика
Отредактируйте новые методы контроллера и отредактируйте:
# GET /developers/new
def new
@developer = Developer.new
@beers = Beer.all
respond_to do |format|
format.html # new.html.erb
end
end
# GET /developers/1/edit
def edit
@beers = Beer.all
respond_to do |format|
format.html # new.html.erb
end
end
Снимки экрана
Примечания
Строительные леса из рельсов - это здорово.Посмотрите на все файлы, которые он создает для вас:
$ be rails g scaffold beer name
invoke active_record
create db/migrate/20140912144218_create_beers.rb
create app/models/beer.rb
invoke rspec
create spec/models/beer_spec.rb
invoke factory_girl
create spec/factories/beers.rb
invoke resource_route
route resources :beers
invoke scaffold_controller
create app/controllers/beers_controller.rb
invoke erb
create app/views/beers
create app/views/beers/index.html.erb
create app/views/beers/edit.html.erb
create app/views/beers/show.html.erb
create app/views/beers/new.html.erb
create app/views/beers/_form.html.erb
invoke rspec
create spec/controllers/beers_controller_spec.rb
create spec/views/beers/edit.html.erb_spec.rb
create spec/views/beers/index.html.erb_spec.rb
create spec/views/beers/new.html.erb_spec.rb
create spec/views/beers/show.html.erb_spec.rb
create spec/routing/beers_routing_spec.rb
invoke rspec
create spec/requests/beers_spec.rb
invoke helper
create app/helpers/beers_helper.rb
invoke rspec
create spec/helpers/beers_helper_spec.rb
invoke jbuilder
create app/views/beers/index.json.jbuilder
create app/views/beers/show.json.jbuilder
invoke assets
invoke coffee
create app/assets/javascripts/beers.js.coffee
invoke scss
create app/assets/stylesheets/beers.css.scss
invoke scss
create app/assets/stylesheets/scaffolds.css.scss
Все, что вам нужно сделать, это знать, какие файлы изменять, когда вам нужно нечто большее, чем простые операции CRUD.
Надеюсь, это поможет.~ Лекс
Строительные леса есть строительные леса.Если вам нужно что-то другое, кроме CRUD в таблице (что и представляет собой scaffold), вам нужно изменить сгенерированный код scaffolding или создать свой собственный.