Jquery 友好id gem出现问题,尝试定位正确id时出现问题

Jquery 友好id gem出现问题,尝试定位正确id时出现问题,jquery,mysql,ruby-on-rails,ruby,friendly-id,Jquery,Mysql,Ruby On Rails,Ruby,Friendly Id,因此,我正在为学校建立一个网站,该网站由不同的维基组成,用户可以创建、更新、编辑等。在我的维基编辑页面上,我允许高级用户在他们创建的维基上添加或删除合作者,如果他们选择将其维基作为私有维基 我将此添加/删除协作者功能设计为与AJAX一起使用,以便用户可以在不刷新页面的情况下,与选择作为协作者添加或删除的其他用户来回切换 在我实现友好的_id gem之前,我的添加/删除功能工作得很好。然而,在实现了友好的_id gem之后,我注意到了一个新的bug。让我解释一下 每当我单击以将用户添加为协作者时,

因此,我正在为学校建立一个网站,该网站由不同的维基组成,用户可以创建、更新、编辑等。在我的维基编辑页面上,我允许高级用户在他们创建的维基上添加或删除合作者,如果他们选择将其维基作为私有维基

我将此添加/删除协作者功能设计为与AJAX一起使用,以便用户可以在不刷新页面的情况下,与选择作为协作者添加或删除的其他用户来回切换

在我实现友好的_id gem之前,我的添加/删除功能工作得很好。然而,在实现了友好的_id gem之后,我注意到了一个新的bug。让我解释一下

每当我单击以将用户添加为协作者时,事情都会显示为它们已经工作,我可以在添加和删除之间来回切换。但是,我最初尝试添加的用户没有被添加为协作者,这在堆栈跟踪中很明显

这是第一次单击“添加”链接后发生的情况:

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)
请注意,如何尝试使用
[“user\u id”,3],“wiki\u id”,0]

用户id正确,但wiki id不正确。为什么会这样?友好的_id gem正在运行,正如您可以看到的,这个特定wiki的名称是“hipster”

这一点在这里很明显:

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
但是,由于我刚刚尝试将用户作为协作者“添加”,现在链接已切换为“删除”,以摆脱协作者

单击以删除协作者后,“我的服务器日志”将显示以下内容:

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)
然后,当我再次切换以将用户添加为协作者时,这一次他们实际上得到了添加

服务器日志:

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)
我注意到,这一次围绕参数读取
参数:{“user\u id”=>“3”,“wiki\u id”=>“51”}
而不是
参数:{“user\u id”=>“3”,“wiki\u id”=>“hipster”}

为什么会这样?如何使此功能正常工作

以下是一些相关文件:

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
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
如果我遗漏了任何文件,您可以在github上查看我的回购协议:


找出了问题所在。在collaborators\u控制器内部,在创建操作中,我必须更改

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

参数[:wiki\u id]
以友好的\u id slug为目标,而它本应以
@wiki.id

- 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>");
%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'
@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])