Question

Je ne sais pas si je lis ce droit , mais il semble que Scaffold ne fasse pas de relation un à plusieurs. dans son intégralité. Par exemple, si je crée messages avec un échafaudage et que je veux comments ensuite sur ceux-ci message (un comment - & Gt; plusieurs new), je dois tout modifier. Par exemple, je dois changer cela dans la vue @message de <=>

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

à ceci

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

puis modifiez l'action pour configurer la <=> var ... entre autres.

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

Était-ce utile?

La solution

C'est vrai, mais ce n'est pas la fin de l'histoire. Il existe au moins deux alternatives à Scaffold: les deux fonctionnent très bien et détectent automatiquement les relations entre les classes (en fonction de vos indicateurs de relation ActiveRecord tels que has_many). Une de ces solutions est simplifiée et l'autre ActiveScaffold .

Ils sont principalement utiles pour la saisie des données requises par votre système 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 ne sert à rien de créer une interface utilisateur complète pour CRUD alors que l'une des alternatives d'échafaudage fera l'affaire avec une fonctionnalité rarement utilisée. Vous ne voudriez cependant pas les utiliser pour commenter des messages.

Autres conseils

Oui. Échafaudage 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 permettre à CRUD d'utiliser un modèle à l'aide d'un contrôleur et de vues associées. C'est tout. Toute autre exigence telle que les relations doit être codée manuellement.

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

Vous finissez par payer pour ce sucre en ayant beaucoup plus d'application construite dans votre dos. Au lieu de vous lancer vous-même, vous soustrayez généralement ce dont vous avez besoin d’une vaste banque de comportements préconçus.

Vous n'avez pas besoin d'un framework d'administration lourd pour faire fonctionner les relations un à plusieurs.

Vous pouvez utiliser un échafaudage pour atteindre le maximum.

Un peu plus de travail dans la vue Contrôleur et _form vous permettra de continuer.

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 ayons un tableau des bières :

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

Et une table développeurs comportant une clé étrangère (beer_id) référençant la table beers:

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

Nous pouvons utiliser un échafaudage pour créer les deux tables:

  

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

     

$ rails g nom du développeur d'échafaudage beer_id: entier

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

Nous devrons modifier un peu nos contrôleurs et nos vues pour que le menu déroulant sélectionne une bière pour chaque développeur:

app / views / developers / _form.html.erb

Remplacez les champs text_field et label générés par beer_id par les éléments suivants:

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

app / controllers / developer_controller.rb

Modifiez les nouvelles méthodes et les méthodes d'édition du 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

entrer la description de l'image ici

entrer la description de l'image ici

entrer la description de l'image ici

Notes

Les échafaudages sur rails sont excellents. 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

Il vous suffit de savoir quels fichiers modifier lorsque vous souhaitez effectuer davantage que des opérations CRUD de base.

J'espère que ça aide. ~ Lex

Les échafaudages sont des échafaudages. Si vous souhaitez autre chose qu'un CRUD sur une table (c'est ce qu'un échafaudage est / fait), vous devez modifier le code d'échafaudage généré ou lancer le vôtre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top