2017-09-22 2 views
0

J'essaie de comprendre comment importer un fichier CSV pour créer de nouveaux enregistrements et créer les associations appropriées.Rails CSV import - association paramètres

J'ai 3 modèles:
1) agriculteurs (has_many: fermes)
2) Ferme (has_many: cultures, belongs_to: agriculteur)
3) cultures (belongs_to: ferme)

L'objectif est que l'utilisateur crée chaque batterie manuellement, puis importez les cultures via un fichier CSV. Je n'arrive pas à comprendre comment passer le farm_id aux récoltes téléchargées, créant l'association.

L'action d'importation sur le contrôleur des cultures:

def import 
    Crop.import(params[:file], params[:farm_id]) 
    redirect_to root_url, notice: "Crops imported." 
end 

La méthode d'importation dans le modèle de récolte:

def self.import(file, farm) 
     CSV.foreach(file.path, headers: true, encoding:'iso-8859-1:utf-8') do |row| 
     row["farm_id"] = farm 
     Crop.create! row.to_hash 
     end 
    end 

Le formulaire pour le téléchargement sur les fermes # afficher la page:

#@farm = Farm.find(params[:id]) 
<%= form_tag import_crops_path, multipart: true do %> 
<%= file_field_tag :file %> 
<%= submit_tag "import CSV" %> 

Comment ça va? envoyer sur @ farm.id sur la page # show des fermes pour importer # cultures avec le fichier?
Est-il préférable de faire cela à travers le formulaire - ou d'une autre manière?

Répondre

0

Vous pouvez le faire de deux façons, cela dépend de la façon dont vos itinéraires sont configurés.

Si vous avez quelque chose comme

resources :farms do 
    resources :crops 
end 

import_crops_path (@farm, @crop) va générer une url le long des lignes de/fermes /: farm_id/cultures/nouvelles

avec les deux options que vous pouvez obtenir l'id de la ferme avec params [: farm_id]

Une autre option consiste à utiliser un champ masqué.

f.hidden_field(:farm, :id) 

cela va créer un champ html

<input type="hidden" id="farm_id" name"farm[id]" value="#{@farm.id}" /> 

Avec les deux options que vous pouvez obtenir l'ID de ferme avec params [: farm_id]

Références

https://apidock.com/rails/ActionView/Helpers/FormHelper/hidden_field http://guides.rubyonrails.org/routing.html

+0

Jon, merci - C'était un problème de routage votre imbrication suggérée est fixée. Ma seule préoccupation maintenant est que je niche trop de choses. Est-ce une mauvaise pratique? 'ressources: les fermes font ressources: les cultures font collection {post: import} fin fin' – user1510700