2015-09-29 1 views
0

Je construis donc un site Web pour l'école qui se compose de différents wikis que les utilisateurs peuvent créer, mettre à jour, modifier, etc. Sur ma page d'édition wiki, j'autorise une option pour les utilisateurs premium pour ajouter ou supprimer des collaborateurs à un wiki qu'ils ont créé s'ils choisissent de vérifier leur wiki comme privé.problème avec la gemme friendly_id, problèmes en essayant de cibler l'ID correct

J'ai conçu cette fonctionnalité d'ajout/suppression de collaborateurs à utiliser avec AJAX afin qu'un utilisateur puisse basculer avec un autre utilisateur qu'il a choisi d'ajouter ou de supprimer en tant que collaborateur sans actualiser la page. Avant que j'implémente la gemme friendly_id, ma fonction d'ajout/suppression fonctionnait correctement. Cependant, après l'implémentation de la gemme friendly_id, j'ai remarqué un nouveau bug qui avait été créé. Laissez-moi vous expliquer ..

Chaque fois que je clique pour ajouter un utilisateur en tant que collaborateur, les choses apparaissent comme si elles avaient fonctionné et je suis capable de basculer entre l'ajout et la suppression. Cependant, l'utilisateur que j'essaie d'ajouter initialement ne se voit pas ajouté en tant que collaborateur, et il apparaît dans la trace de la pile.

C'est ce qui se passe après avoir cliqué sur le lien « Ajouter » pour la première fois:

Started POST "/wikis/hipsters/collaborators?user_id=3" for 127.0.0.1 at 2015-09-28 17:51:06 -0700 
Processing by CollaboratorsController#create as JS 
    Parameters: {"user_id"=>"3", "wiki_id"=>"hipsters"} 
    Wiki Load (0.2ms) SELECT "wikis".* FROM "wikis" WHERE "wikis"."slug" = 'hipsters' ORDER BY "wikis"."id" ASC LIMIT 1 
    (0.1ms) begin transaction 
    SQL (0.4ms) INSERT INTO "collaborators" ("created_at", "updated_at", "user_id", "wiki_id") VALUES (?, ?, ?, ?) [["created_at", "2015-09-29 00:51:06.185794"], ["updated_at", "2015-09-29 00:51:06.185794"], ["user_id", 3], ["wiki_id", 0]] 
    (85.8ms) commit transaction 
    (0.1ms) begin transaction 
    (0.1ms) commit transaction 
    (0.2ms) SELECT COUNT(*) FROM "collaborators" WHERE "collaborators"."wiki_id" = ? [["wiki_id", 51]] 
    Rendered collaborators/create.js.haml (3.0ms) 
Completed 200 OK in 198ms (Views: 106.9ms | ActiveRecord: 86.8ms) 

Remarquez comment un nouveau collaborateur est tenté d'être fait avec un ["user_id", 3], ["wiki_id", 0]

Le user_id est correct, mais le wiki_id n'est pas. Pourquoi cela arrive-t-il? La gemme friendly_id fonctionne, comme vous pouvez le voir, le nom de ce wiki est "hipsters".

Ceci est rendu manifeste ici:

Parameters: {"user_id"=>"3", "wiki_id"=>"hipsters"} 
    Wiki Load (0.2ms) SELECT "wikis".* FROM "wikis" WHERE "wikis"."slug" = 'hipsters' ORDER BY "wikis"."id" ASC LIMIT 1 

Cependant, comme je viens tenté de « ajouter » un utilisateur en tant que collaborateur, maintenant le lien a basculée pour lire « supprimer », pour se débarrasser d'un collaborateur .

Après avoir cliqué sur pour supprimer le collaborateur, mon journal du serveur affiche les éléments suivants:

Started DELETE "/wikis/51/collaborators/54" for 127.0.0.1 at 2015-09-28 18:02:39 -0700 
Processing by CollaboratorsController#destroy as JS 
    Parameters: {"wiki_id"=>"51", "id"=>"54"} 
    Wiki Load (0.3ms) SELECT "wikis".* FROM "wikis" WHERE "wikis"."slug" = '51' ORDER BY "wikis"."id" ASC LIMIT 1 
    Wiki Load (0.1ms) SELECT "wikis".* FROM "wikis" WHERE "wikis"."id" = ? LIMIT 1 [["id", 51]] 
    Collaborator Load (0.1ms) SELECT "collaborators".* FROM "collaborators" WHERE "collaborators"."id" = ? LIMIT 1 [["id", 54]] 
    (0.1ms) begin transaction 
    SQL (0.4ms) DELETE FROM "collaborators" WHERE "collaborators"."id" = ? [["id", 54]] 
    (30.1ms) commit transaction 
    (0.2ms) SELECT COUNT(*) FROM "collaborators" WHERE "collaborators"."wiki_id" = ? [["wiki_id", 51]] 
    Rendered collaborators/destroy.js.haml (2.0ms) 
Completed 200 OK in 52ms (Views: 16.1ms | ActiveRecord: 31.3ms) 

Puis, quand je bascule pour ajouter l'utilisateur en tant que collaborateur à nouveau, cette fois-ci, ils sont ajoutés en réalité.

journal du serveur:

Started POST "/wikis/51/collaborators?user_id=3" for 127.0.0.1 at 2015-09-28 18:05:59 -0700 
Processing by CollaboratorsController#create as JS 
    Parameters: {"user_id"=>"3", "wiki_id"=>"51"} 
    Wiki Load (0.2ms) SELECT "wikis".* FROM "wikis" WHERE "wikis"."slug" = '51' ORDER BY "wikis"."id" ASC LIMIT 1 
    Wiki Load (0.1ms) SELECT "wikis".* FROM "wikis" WHERE "wikis"."id" = ? LIMIT 1 [["id", 51]] 
    (0.1ms) begin transaction 
    SQL (0.7ms) INSERT INTO "collaborators" ("created_at", "updated_at", "user_id", "wiki_id") VALUES (?, ?, ?, ?) [["created_at", "2015-09-29 01:05:59.564379"], ["updated_at", "2015-09-29 01:05:59.564379"], ["user_id", 3], ["wiki_id", 51]] 
    (182.8ms) commit transaction 
    (0.1ms) begin transaction 
    (0.1ms) commit transaction 
    (0.2ms) SELECT COUNT(*) FROM "collaborators" WHERE "collaborators"."wiki_id" = ? [["wiki_id", 51]] 
    Rendered collaborators/create.js.haml (3.1ms) 
Completed 200 OK in 198ms (Views: 8.3ms | ActiveRecord: 184.2ms) 

Je remarque que cette fois les paramètres lus Parameters: {"user_id"=>"3", "wiki_id"=>"51"} au lieu de Parameters: {"user_id"=>"3", "wiki_id"=>"hipsters"}

Pourquoi est-ce? Comment puis-je obtenir cette fonctionnalité pour fonctionner correctement?

Voici quelques fichiers pertinents:

wikis_controller.rb:

class WikisController < ApplicationController 
    def index 
    @wikis = policy_scope(Wiki) 
    end 

    def show 
    @wiki = Wiki.friendly.find(params[:id]) 
    end 

    def new 
    @wiki = Wiki.new 

    authorize @wiki # Example 
    end 

    def create 
    @wiki = Wiki.new(wiki_params) 

    @wiki.user = current_user 

    authorize @wiki 

    if @wiki.save 
     flash[:notice] = "Wiki was saved." 
     redirect_to @wiki 
    else 
     flash[:error] = "There was an error saving the wiki. Please try again." 
     render :new 
    end 
    end 

    def edit 
    @wiki = Wiki.friendly.find(params[:id]) 
    @users = User.all 

    authorize Wiki, :edit? 
    end 

    def update 
    @wiki = Wiki.friendly.find(params[:id]) 

    authorize @wiki 

    if @wiki.update_attributes(wiki_params) 
     flash[:notice] = "Wiki was updated." 
     redirect_to @wiki 
    else 
     flash[:error] = "There was an error saving the wiki. Please try again." 
     render :edit 
    end 
    end 

    def destroy 
    @wiki = Wiki.friendly.find(params[:id]) 

    authorize Wiki, :destroy? 

    if @wiki.destroy 
     flash[:notice] = "\"#{@wiki.title}\" was deleted successfully." 
     redirect_to wikis_path 
    else 
     flash[:error] = "There was an error deleting the wiki." 
     render :show 
    end 
    end 

    private 

    def wiki_params 
    params.require(:wiki).permit(:title, :body, :private) 
    end 
end 

collaborators_controller.rb:

class CollaboratorsController < ApplicationController 
    def create 
    @wiki = Wiki.friendly.find(params[:wiki_id]) 
    @collaborator = Collaborator.create(wiki_id: params[:wiki_id], user_id: params[:user_id]) 

    respond_to do |format| 
     format.html 
     format.js 
    end 
    end 

    def destroy 
    @wiki = Wiki.friendly.find(params[:wiki_id]) 
    @collab = Collaborator.find(params[:id]) 
    @user_id = @collab.user_id 
    @collab.destroy 

    respond_to do |format| 
     format.html 
     format.js 
    end 
    end 
end 

collaborateurs/create.js.haml:

- if @collaborator.save 
    $('#'+#{ params[:user_id] }).replaceWith('<a data-method="delete" data-remote="true" href="/wikis/'+#{ @wiki.id }+'/collaborators/'+#{ @collaborator.id }+'" id="#{ @collaborator.user_id }" rel="nofollow">Remove</a>'); 
    $('.js-collaborators-count').html("Currently #{ pluralize(@wiki.collaborators.count, 'collaborator') } on this wiki."); 
- else 
    $('#'+#{ params[:user_id] }).prepend("<div class='alert alert-danger'>#{ flash[:error] = 'Oops something went wrong..' }</div>"); 

collaborateurs/destroy.js.haml:

- if @collab.destroyed? 
    $('#'+#{ @user_id.to_s }).replaceWith('<a data-method="post" data-remote="true" href="/wikis/'+#{ @wiki.id }+'/collaborators?user_id=#{ @user_id }" id="#{ @user_id }" rel="nofollow">Add</a>'); 
    $('.js-collaborators-count').html("Currently #{ pluralize(@wiki.collaborators.count, 'collaborator') } on this wiki."); 
- else 
    $('#'+#{ @user_id.to_s }).prepend("<div class='alert alert-danger'>#{ flash[:error] = 'Oops something went wrong..' }</div>"); 

wikis/edit.html.haml:

%h1 Edit Wiki 

.row 
    .col-md-8 
    = form_for @wiki do |f| 
     .form-group 
     = f.label :title 
     = f.text_field :title, class: 'form-control', placeholder: "Enter wiki title" 
     .form-group 
     = f.label :body 
     = f.text_area :body, rows: 8, class: 'form-control', placeholder: "Enter wiki body" 

     - if current_user.role == 'admin' || (current_user.role == 'premium' && @wiki.user == current_user) 
     = render 'wikis/form', f: f 

     - if current_user.role == 'admin' || (@wiki.private == true && @wiki.user == current_user) 
     .form-group 
      %h5 
      Add/Remove Collaborators to the 
      %em &ldquo;#{ @wiki.title }&rdquo; 
      wiki (Showing all users) 
      %small 
      .js-collaborators-count 
       Currently #{ pluralize(@wiki.collaborators.count, 'collaborator') } on this wiki. 
      .col-sm-4.text-center.outline 
      %h6.underline Name 
      - @users.each do |u| 
       .border_bottom 
       = u.name 
       %br/ 

      .col-sm-4.text-center.outline 
      %h6.underline Email 
      - @users.each do |u| 
       .border_bottom 
       = u.email 

      .col-sm-4.text-center.outline 
      %h6.underline Give Access 
      - @users.each do |u| 
       .border_bottom 
       - if collab = u.collaborators.find_by(wiki_id: @wiki.id) 
        = link_to "Remove", wiki_collaborator_path(@wiki, collab), method: :delete, remote: true, id: u.id 
       - else 
        = link_to "Add", wiki_collaborators_path(@wiki, user_id: u.id), method: :post, remote: true, id: u.id 

     .form-group 
     = f.submit "Update", class: 'btn btn-success mt_10' 

Si je partais tous les fichiers que vous pouvez voir sur mon repo sur github ici:

https://github.com/jlquaccia/blocipedia

Répondre

0

cernées ce qui était faux. A l'intérieur du collaborators_controller dans le créer une action que je devais changer

@collaborator = Collaborator.create(wiki_id: params[:wiki_id], user_id: params[:user_id]) 

à

@collaborator = Collaborator.create(wiki_id: @wiki.id, user_id: params[:user_id]) 

Le params[:wiki_id] ciblaient la limace friendly_id quand il aurait dû cibler les @wiki.id