Rails: леса для автоматического выполнения отношений "один ко многим"
Не уверен, что я читаю этот, но похоже, что Scaffold не будет полностью связывать отношения "один ко многим". Например, если я создаю messages
с эшафотом, а затем хочу comments
на этих messages
(один message
→ many comments
), мне нужно пройти и изменить все. Например, я должен изменить это в представлении comment
new
<% form_for(@comment) do |f| %>
к этому
<% form_for([@message, @comment]) do |f| %>
а затем измените действие, чтобы настроить @message
var... между прочим.
В настоящее время это невозможно сделать автоматически с помощью Scaffold, правильно?
Ответы
Ответ 1
Это правда, но это не конец истории. Есть как минимум две альтернативы Scaffold, которые работают достаточно хорошо и автоматически выбирают отношения между классами (на основе ваших индикаторов отношений ActiveRecord, таких как has_many). Один из этих альтернатив - Streamlined, а другой ActiveScaffold.
Они в основном полезны для ввода данных, требуемых вашей системой, которые не являются введенными пользователем данными. Например, я использую их для задач администрирования в таблицах, где нет смысла создавать полный пользовательский интерфейс для CRUD, когда один из альтернативных вариантов эстафет делает работу просто отлично для редко используемой функции. Однако вы не хотели бы использовать их для комментариев к сообщениям.
Ответ 2
Да. Леса работают для модели и соответствующего контроллера. Он не заботится и не работает с отношениями.
Основная задача scaffold - получить CRUD на модели с использованием контроллера и связанных с ним представлений. Все это. Любые другие требования, такие как отношения, должны быть закодированы вручную.
Ответ 3
Обратите внимание, что существуют проекты типа Hobo для Rails, которые позволяют сохранять ваши поля и ассоциации внутри самой модели. Вы не можете создавать ассоциации, но это довольно близко.
В конечном итоге вы платите за этот сахар, имея гораздо больше приложений, созданных за спиной. Вместо того, чтобы кататься самостоятельно, вы обычно вычитаете, что вам нужно, из большого банка с заранее подготовленным поведением.
Ответ 4
Леса - это леса. Если вы хотите что-то другое, кроме CRUD на столе (это то, что делает/делает эшафот), вам нужно изменить сгенерированный код леса или перевернуть его.
Ответ 5
Вам не нужна мощная система администрирования rails, чтобы получить отношения "один ко многим".
Вы можете использовать строительные леса, чтобы получить большую часть пути.
Немного больше работы в контроллере и в представлении _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 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
И таблица разработчиков, имеющая внешний ключ (beer_id), ссылающийся на таблицу пива:
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 название пивного леса
$rails g имя разработчика scaffold beer_id: integer
Команда 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
Экранные снимки
![enter image description here]()
![enter image description here]()
![enter image description here]()
Примечания
Рельсы строительные леса велики. Посмотрите на все файлы, которые он создает для вас:
$ 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.
Надеюсь, что это поможет.
~ Лекс