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.

Надеюсь, что это поможет. ~ Лекс