Rails: эшафот для автоматического установления отношений один-ко-многим - PullRequest
14 голосов
/ 02 февраля 2009

Не уверен, правильно ли я читаю это , но похоже, что Скаффолд не будет делать отношения один-ко-многим во всей своей полноте. Например, если я создаю messages с помощью скаффолда, а затем я хочу comments на этих messages (один message -> много comments), я должен пройти и изменить все. Например, я должен изменить это в представлении comment new

<% form_for(@comment) do |f| %>

к этому

<% form_for([@message, @comment]) do |f| %>

, а затем измените Действие, чтобы настроить @message var ... среди прочего.

В настоящее время это нельзя сделать автоматически с помощью скаффолда, верно?

Ответы [ 5 ]

13 голосов
/ 02 февраля 2009

Да. Эшафот работает для модели и соответствующего контроллера. Это не заботиться или работать с отношениями.

Основная задача Scaffold - запустить CRUD на модели, используя контроллер и связанные представления. Это все. Любые другие требования, такие как отношения, должны быть закодированы вручную.

12 голосов
/ 05 февраля 2009

Это правда, но это не конец истории. Существует как минимум две альтернативы Scaffold, которые работают достаточно хорошо и автоматически выбирают отношения между классами (на основе ваших индикаторов отношений ActiveRecord, таких как has_many). Одна из этих альтернатив - Обтекаемая , а другая - ActiveScaffold .

Они в основном полезны для ввода данных, которые требуются вашей системе, а не введенных пользователем данных. Например, я использую их для административных задач в таблицах, в которых нет смысла создавать полный пользовательский интерфейс для CRUD, когда одна из альтернатив скаффолда отлично справится с редко используемой функцией. Вы не хотели бы использовать их для комментариев к сообщениям.

3 голосов
/ 13 августа 2009

Обратите внимание, что существуют проекты, такие как Hobo для Rails, которые позволяют вам хранить ваши поля и ассоциации в самой модели. Вы не можете создавать ассоциации, но это довольно близко.

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

2 голосов
/ 12 сентября 2014

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

Вы можете использовать леса, чтобы пройти большую часть пути туда.

Немного больше работы в контроллере и _form view поможет вам в этом.

Вот как ...

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

И таблица разработчиков с внешним ключом (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 имя разработчика леса 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

Снимки экрана

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.

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

1 голос
/ 02 февраля 2009

Строительные леса - строительные леса. Если вам нужно что-то кроме CRUD для таблицы (что и делает скаффолд), вам нужно изменить сгенерированный код скаффолдинга или свернуть свой собственный.

...