2017-02-23 1 views
0

J'ai donc un modèle 'Project' dont la table db respective a de nombreux attributs.Diviser une vue d'édition Rails pour les besoins de l'interface utilisateur

Idéalement, quand je frappe projects/1/edit, je voudrais l'utilisateur:

  1. Voir et être en mesure de modifier une partie seulement du projet attribue
  2. Voir un menu de navigation qui lui permet de naviguer à une autre vue qui permet de voir et de modifier les attributs laissés.

Tout cela au lieu de montrer tous les attributs dans une vue d'édition.

Je suis penché vers une solution JS qui cache et montre des attributs spécifiques quand un menu est cliqué. Cependant, je veux idéalement que les urls reflètent la section se trouve l'utilisateur, par exemple:

Au lieu d'une URL comme projects/1/edit Je voudrais quelque chose comme: projects/1/edit/name_of_section_1 et projects/1/edit/name_of_section_2

En tout cas, je me demande Quelle serait la meilleure pratique quand il s'agit de diviser des vues comme celle-ci.

MISE À JOUR: Seulement quelques precisions/révisions de la solution de Dan ci-dessous pour référence future

J'ai utilisé sa deuxième approche avec succès la révision de son code proposé comme suit:

Config/routes.rb révisé le nom du contrôleur pour les deux routes aux 'projets'

resources :projects do 
    member do 
     get "settings/:panel" => "projects#edit", as: :settings 
     patch "settings/:panel/update" => "projects#update", as: :update_settings 
    end 
end 

Contrôleurs/projects_controller.rb Il y avait une erreur dans le code proposé pour l'action de modifier si je légèrement changé pour le faire fonctionner

def edit 
    panel = ['general', 'invitations', 'welcome_message', 'danger'].detect{|p| p == params[:panel] } 
    render template: "projects/#{panel}.html.erb" if panel 
    end 

Répondre

1

Il y a deux façons de le faire et il tous également valables. Si vous avez besoin tous les champs remplis pour créer l'enregistrement que vous aurez soit besoin d'avoir des vues à onglets avec javascript (bootstrap a un bon plug-in pour cela)

Pour ce faire avec des itinéraires personnalisés vous pourriez avoir: resources :projects do member do get "settings" patch "update_settings" get "settings2" patch "update_settings2" end end

qui vous donnera les URL comme /projects/1/settings et projects/1/update_settings

Si vous avez beaucoup de panneaux, vous pouvez le faire plus efficacement avec quelque chose comme ceci:

resources :projects do 
    member do 
    get "settings/:panel" => "settings#edit" as: :settings 
    patch "settings/:panel/update" => "settings#update" as: :update_settings 
    end 
end 

pour permettre routes comme /projects/1/settings/page1 et /projects/1/settings/page2

dans votre contrôleur, vous pouvez alors:

def edit 
    if panel = ['page1', 'page2'].detect{|p| p == params[:panel] } 
    render template: panel 
    end 
end 

ce contrôle ifs est un groupe valide que vous avez fait et rend ensuite ce modèle spécifique que vous avez créé dans app/view/projects/page1.html.erb

+0

Dan, merci beaucoup pour votre réponse. S'il vous plaît laissez-moi essayer et revenir à vous. Je pense que je dois essayer de comprendre clairement la solution. Je vous ferai savoir bientôt comment ça se passe – Andrew

+0

Dan, j'ai essayé votre deuxième approche avec succès. Merci beaucoup. Je comprends toujours Rails et parfois confus avec la façon de configurer les routes, alors vous m'avez économisé du temps! Je viens de mettre à jour ma question pour refléter certaines modifications que j'ai dû apporter à votre code pour que cela fonctionne. Si quelque chose ne vous semble pas correct. Faites le moi savoir. À votre santé. – Andrew

+0

Sucré comme. Les révisions sont à peu près correctes. C'était l'heure du dîner quand je l'écrivais et ma femme me donnait ce regard qui disait «dépêche-toi». N'hésitez pas à l'accepter comme réponse et je serai un homme heureux :) – Dan