2009-02-02 11 views
14

Je ne sais pas si je lis this à droite, mais il semble que Scaffold ne fera pas une relation un-à-plusieurs dans son intégralité. Par exemple, si je crée messages avec l'échafaudage et puis je veux comments sur ceux messages (un message -> beaucoup comments), je dois passer par et changer tout. Par exemple, je dois modifier dans la vueRails: Scaffold pour faire automatiquement une relation un-à-plusieurs

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

à cette

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

puis modifiez l'action pour mettre en place le @message var ... entre autres.

Cela ne peut pas être fait automatiquement avec Scaffold, n'est-ce pas?

Répondre

12

C'est vrai, mais ce n'est pas la fin de l'histoire. Il existe au moins deux alternatives à Scaffold qui fonctionnent toutes deux très bien et reprennent automatiquement les relations entre les classes (en fonction de vos indicateurs de relation ActiveRecord comme has_many). L'une de ces alternatives est Streamlined et l'autre est ActiveScaffold.

Ils sont principalement utiles pour saisir les données dont votre système a besoin et qui ne sont pas des données saisies par l'utilisateur. Par exemple, je les utilise pour des tâches administratives sur des tables où il est inutile de créer une interface utilisateur complète pour CRUD lorsque l'une des alternatives d'échafaudage fera l'affaire pour une fonctionnalité rarement utilisée. Cependant, vous ne voudriez pas les utiliser pour commenter des messages.

+1

Bonnes choses, John, merci. –

+0

Pour tout un tas d'options possibles: https://www.ruby-toolbox.com/categories/rails_admin_interfaces – givanse

13

Oui. Scaffold fonctionne pour un modèle et un contrôleur associé. Il ne prend pas soin de ou ne travaille pas avec les relations.

L'objectif principal de Scaffold est de faire fonctionner CRUD sur un modèle en utilisant un contrôleur et des vues connexes. C'est tout. Toute autre exigence comme les relations doit être codée manuellement.

+1

Excellent. Cela me permet d'économiser un peu de travail ... J'imagine/je rêve que dans le futur ça va aussi faire des relations. –

+0

Oui. Et j'imagine une application qui écrit une application rails avec glisser-déposer et configuration minimale. Ça va arriver. Bientôt! :) – Chirantan

+0

J'imagine que vous avez déjà vu la gemme Admin, non? –

1

Les échafaudages sont des échafaudages. Quand vous voulez autre chose qu'un CRUD sur une table (qui est ce que fait un échafaudage), vous devez modifier le code d'échafaudage généré, ou rouler le vôtre.

+0

Merci pour cela.Je voudrais arrêter de rouler, mais en 2009, il s'agit toujours de rouler les siens. –

3

Notez qu'il existe des projets comme Hobo pour Rails qui vous permettent de conserver vos champs et vos associations dans le modèle lui-même. Vous ne pouvez pas échafauder des associations, mais c'est assez proche.

Vous finissez par payer pour ce sucre en ayant beaucoup plus de l'application construite derrière votre dos. Au lieu de rouler les vôtres, vous soustrayez habituellement ce dont vous avez besoin d'une grande banque de comportements prédéfinis.

+0

Cool, merci, je vais vérifier. En ce moment je n'utilise jamais Scaffold, mais j'utilise même les trucs REST un peu ... –

1

Vous n'avez pas besoin d'une structure d'administration de rails lourds pour que les relations un-à-plusieurs fonctionnent.

Vous pouvez utiliser un échafaudage pour obtenir la plupart du chemin. Un peu plus de travail dans le contrôleur et dans la vue _form vous permettra de continuer le travail.

Voici comment ...

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> 

En supposant que nous avons une bières table:

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

Et développeurs tableau qui a une clé étrangère (beer_id) faisant référence à la table des bières:

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

Nous peut utiliser des échafaudages pour créer les deux tables:

$ rails g nom de bière d'échafaudage

rails $ Nom du promoteur d'échafaudage g beer_id: entier

La commande d'échafaudage crée les contrôleurs et les vues pour chaque modèle.

Nous devons modifier nos contrôleurs et les vues un peu pour obtenir le menu déroulant pour sélectionner une bière pour chaque développeur:

app/views/développeurs/_form.html.erb

remplacer le text_field généré et une étiquette pour beer_id de ce qui suit:

<div class="field"> 
    <%= f.label :beer_id %><br /> 
    <%= collection_select(:developer, :beer_id, @beers, :id, :name, {:prompt => false}) %> 
    </div> 

app/controllers/developer_controller.rb

Modifier les méthodes nouvelles et modifier les attributs contrôleur:

# 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 

Captures d'écran

enter image description here

enter image description here

enter image description here

Notes

L'échafaudage de rails est génial. Regardez tous les fichiers qu'il crée pour vous:

$ 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 

Tout ce que vous devez faire est de savoir quels sont les fichiers à modifier quand vous voulez plus que les opérations de base CRUD.

Espérons que ça aide. ~ Lex