Рельсы:Каркас для автоматического установления отношения "один ко многим"

StackOverflow https://stackoverflow.com/questions/502119

Вопрос

Не уверен, читаю ли я это верно, но похоже, что 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

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

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.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top