2017-04-26 5 views
0

J'ai 2 tables, landslides et sources (peut-être ne se rapportent pas les uns aux autres). Je veux un formulaire qui permet à l'utilisateur de remplir des informations et ensuite soumettre aux deux tables. Voici ma forme actuelle sans sources champs:Soumettre un formulaire à 2 tables dans la base de données - ruby ​​sur les rails

= form_for :landslide, :url => {:controller => 'landslides', :action => 'create'} do |f| 

     .form-inputs 
     %form#landslideForm 
      .form-group.row 
      %label.col-sm-2.col-form-label{for: "textinput"}Date 
      .col-sm-10 
       = f.date_select :start_date, :class => "form-control" 
      #Some fields 
    .form-actions 
     = f.button :submit, class: "btn btn-lg btn-primary col-sm-offset-5", id: "submitButton" 

et paramètres:

def landslide_params 
      params.require(:landslide).permit(:start_date, :continent, :country, :location, :landslide_type, :lat, :lng, :mapped, :trigger, :spatial_area, :fatalities, :injuries, :notes) 
    end 

    def source_params 
     params.require(:source).permit(:url, :text, :landslide_id) 
    end 

Il y a aussi une colonne dans sources appels landslide_id qui prennent l'ID de glissement de terrain de la table landslides. Donc, quand un utilisateur soumet un nouveau glissement de terrain, comment puis-je prendre l'ID de glissement de terrain à venir (qui est l'incrémentation automatique, l'utilisateur n'a pas besoin de remplir)?

Merci!

Répondre

1

code HTML ne permet pas <form> imbriqués éléments et vous pouvez Ne pas passer l'id de l'enregistrement qui n'a pas encore été persisté à travers un formulaire (parce qu'il n'a pas d'identifiant).

Pour créer une ressource imbriquée dans la même requête que vous utilisez accepts_nested_attributes_for:

class Landslide 
    # or has_many 
    has_one :source 
    accepts_nested_attributes_for :source  
end 

class Source 
    belongs_to :landslide 
end 

Cela signifie que vous pouvez faire Landslide.create(source_attributes: { foo: 'bar' }) et il crée à la fois un Landslide et un Source enregistrement et relie automatiquement par sources.landslide_id.

Pour créer les entrées de formulaire utilisent fields_for:

# use convention over configuration 
= form_for @landslide do |f| 
    .form-inputs 
    .form-group.row 
     # use the form builder to create labels instead 
     = f.label :start_date, class: 'col-sm-2 col-form-label' 
     .col-sm-10 
     = f.date_select :start_date, class: "form-control" 
    %fieldset 
     %legend Source 
     = f.fields_for :sources do |s| 
     .form-group.row 
      = s.label :url, class: 'col-sm-2 col-form-label' 
      .col-sm-10 
      = s.text_field :url, class: "form-control" 
     # ... 

class LandslidesController 

    # ... 

    def new 
    @landslide = Landslide.new 
    # this is needed to seed the form with inputs for source 
    @landslide.source.new 
    end 

    def create 
    @landslide = Landslide.new(landslide_params) 
    if @landslide.save 
     redirect_to @landslide 
    else 
     @landslide.source.new unless @landslide.source.any? 
     render :new 
    end 
    end 

    private 
    def landslide_params 
    params.require(:landslide).permit(
     :start_date, :continent, :country, 
     :location, :landslide_type, 
     :lat, :lng, :mapped, :trigger, :spatial_area, 
     :fatalities, :injuries, :notes, 
     source_attributes: [ :url, :text ] 
    ) 
    end 
end 
+0

Merci. Cette réponse est vraiment détail. Cependant, j'ai toujours l'erreur 'paramètre non autorisé trouvé: sources' –

+0

Posez une nouvelle question avec ceci comme point de départ si vous voulez l'aide de débogage. – max

+0

Je pense qu'il s'agit de source/sources, si un glissement de terrain a de nombreuses sources, ai-je besoin de changer chaque source pour les sources? –

0

Vous devez utiliser accept_nested_attributes_for et intégrez-forme en conséquence: (. Sous réserve en ce qui concerne la forme que devrait être imbriquées dans lequel, je donne l'exemple des sources soumises via forme de glissement de terrain)

dans landslide.rb

accept_nested_attributes_for :sources 

à votre avis (je ne sais pas haml mais de toute façon)

<%= form_for :landslide do |f|%> 
    <%= f.select :start_date %> 

    <%= fields_for :sources do |s| %> 
     <%= s.input :your_column %> 
    <% end %> 

    <%= f.button :submit %> 
<% end %> 

BTW, il y a beaucoup de questions sur ce déjà, il est appelé «emboîtées les formes de

Nested forms in rails - accessing attribute in has_many relation

Rails -- fields_for not working?

fields_for in rails view