2009-02-02 9 views
14

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

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

к этому

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

, а затем изменить действие, чтобы настроить @message вар ... среди других вещей.

В настоящее время это не может быть сделано автоматически с помощью Леса, правильно?

ответ

12

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

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

+1

Хороший материал, Джон, спасибо. –

+0

Для целого ряда возможных вариантов: https://www.ruby-toolbox.com/categories/rails_admin_interfaces – givanse

13

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

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

+1

Отлично. Он по-прежнему сохраняет справедливую работу ... Я воображаю/мечтаю о том, что в будущем это будет также делать отношения. –

+0

Да. И я представляю себе приложение, которое записывает приложение rails с перетаскиванием и минимальной конфигурацией. Это произойдет. Скоро! :) – Chirantan

+0

Я полагаю, вы уже видели админ-драгоценность, верно? –

1

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

+0

Спасибо за это.Я бы хотел прекратить катиться, но в 2009 году все еще нужно перевернуть свой. –

3

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

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

+0

Прохладный, спасибо, я проверю это. Прямо сейчас я не использую Skaffold когда-либо, но я даже использую вещи REST совсем немного ... –

1

Для создания отношений «один-ко-многим» вам не нужен мощный механизм 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'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), ссылающееся пиво таблицу:

create_table "developers", force: true do |t| 
    t.string "name" 
    t.integer "beer_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

Мы могут использовать строительные леса для создания обеих таблиц:

$ рельсов г эшафот Name пива на

$ рельсов имени проявителя г подмостей beer_id: Integer

Команда эшафота создает контроллеры и представление для каждой модели.

Мы должны изменить наши контроллеры и взгляды немного, чтобы получить выпадающее меню, чтобы выбрать пиво для каждого разработчика:

приложение/просмотров/Разработчики/_form.html.erb

Заменить сгенерированный text_field и метку для 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

 Смежные вопросы

  • Нет связанных вопросов^_^