2016-12-04 1 views
6

Déjà un mois en essayant de résoudre le problème à première vue n'est pas très compliqué: Il y a 3 modèles - team, user et team_user (has_namy: through) Sous la forme d'édition et de nouvelle équipe pour faire la possibilité d'ajouter dynamiquement membres de cette équipe.Rails 5 - comment ajouter dynamiquement des champs imbriqués dans le formulaire d'édition?

Scénario:

  • Un utilisateur vient à l'équipe nouvelle forme
  • Indique le nom de l'équipe
  • champ Après le nom d'utilisateur, sélectionnez (membre de l'équipe)
  • Cliquez sur le bouton Ajouter membre
  • après validation d'un membre est ajouté après le champ nom de l'équipe dans le champ texte + bouton supprimer en face
  • dans le sélecteur supprimer son (membre) nom (comme il est déjà membre de l'équipe)
  • Selite sélectionne l'utilisateur suivant, puis cliquez sur le bouton Ajouter membre
  • Appuyez sur le bouton Soumettre pour enregistrer les membres de la nouvelle équipe et l'équipe

difficultés:

  • j'ai essayé de le faire à travers la pierre précieuse Cocoon, mais il est impossible de faire différents parshaly pour sélectionner l'utilisateur à ajouter à ce (SELECT) et a ajouté des membres (nom complet - texte)
  • Si fait à travers le <% = from_for ... remote: true%> et un contrôleur séparé ou une nouvelle action dans le controller teams_controller, il y aura deux formes d'imbriquées (forme et forme team_utilisateur) avec son 2ème bouton de soumission. Si je comprends bien, les formes d'attachement ne sont pas gud.
  • Les changements dans la forme (changer le nom de l'équipe et ajouter/supprimer les membres de l'équipe ont le compte qu'après avoir cliqué sur la sauvegarde de soumettre essentiellement l'équipe de formulaire)

enter image description here

app/modèles/user.rb

class User < ApplicationRecord 
    has_many :team_users 
    has_many :teams, through: :team_users 
    accepts_nested_attributes_for :team_users, :teams, allow_destroy: true 
end 

app/modèles/team.rb

class Team < ApplicationRecord 
    has_many :team_users 
    has_many :users, through: :team_users 
    accepts_nested_attributes_for :team_users, allow_destroy: true, reject_if: proc { |a| a['user_id'].blank? } 
end 

app/models/team_user.rb

class TeamUser < ApplicationRecord 
    belongs_to :team 
    belongs_to :user 
    accepts_nested_attributes_for :team, :user, allow_destroy: true 
end 

app/controllers/teams_controller.rb

class TeamsController < ApplicationController 
    before_action :set_team, :set_team_users, only: [:show, :edit, :update, :destroy] 
    before_action :set_team_ancestry, only: [:new, :edit, :create, :update, :destroy] 
    before_action :set_new_team_user, only: [:new, :edit] 
    before_action :logged_in_user 

    layout 'sidebar' 

    # GET /teams 
    def index 
    @teams = Team.search(params[:search], :name).sorting(params[:sort], params[:direction]).paginate(page: params[:page]) 
    end 

    # GET /teams/1 
    def show 
    end 

    # GET /teams/new 
    def new 
    @team = Team.new(parent_id: params[:parent_id]) 
    end 

    # GET /teams/1/edit 
    def edit 
    @team_users = @team.team_users 
    end 

    # POST /teams 
    def create 
    @team = Team.new(team_params) 

    respond_to do |format| 
     if @team.save 
     format.html { redirect_to @team, success: t('.flash.success.message') } 
     else 
     format.html { render :new, danger: t('.flash.danger.message') } 
     end 
    end 
    end 

    # PATCH/PUT /teams/1 
    def update 
    respond_to do |format| 
     if @team.update(team_params) 
     format.html { redirect_to @team, success: t('.flash.success.message') } 
     else 
     format.html { render :edit, danger: t('.flash.danger.message') } 
     end 
    end 
    end 

    # DELETE /teams/1 
    def destroy 
    @team.destroy 
    respond_to do |format| 
     format.html { redirect_to teams_url, success: t('.flash.success.message') } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_team 
     @team = Team.find(params[:id]) 
    end 

    def set_team_ancestry 
     @team_collection = Team.where.not(id: params[:id]).all.each { |c| c.ancestry = c.ancestry.to_s + (c.ancestry != nil ? "/" : '') + c.id.to_s 
     }.sort{ |x,y| x.ancestry <=> y.ancestry }.map{ |c| ["-" * (c.depth - 1) + c.name,c.id] } 
    end 

    def set_team_users 
     @team_users_collection = User.all.collect { |p| [ p.name, p.id ] } 
    end 

    def set_new_team_user 
     @team_users_new = @team.team_users.build 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def team_params 
     params.require(:team).permit(
     :name, 
     :parent_id, 
     team_users_attributes: [:_destroy, :id, :user_id] 
    ) 
    end 
end 
+0

Avez-vous trouvé une solution? – Thrasher

+0

@Thrasher Pas encore ( –

+0

Ceci est la même réponse que je cherche. Espérons que quelqu'un aide bientôt! – pappy

Répondre

0

I suivie de la solution à partir d'un DriftingRuby episode. J'ai été capable de l'implémenter dans mon application ainsi que de personnaliser certaines fonctionnalités. Note: Cela vaut tant pour les new et edit formes, mais vous pouvez facilement le faire pour seulement la forme edit.