红宝石在轨道上

我为Rails应用程序使用acts-as-taggable-on,并且每次创建新照片时(例如),我都会在'tagging'表中获得重复的行。

我的模型类看起来像这样:

class User < ActiveRecord::Base
  acts_as_tagger
  ...
end

class Photo < ActiveRecord::Base
   acts_as_taggable_on :tags
   ...
end

并在我的photos_controller创建行动

def create
  @user = current_user
  ... 
  @user.tag(@photo, :with => params[:photo][:tag_list], :on => :tags)
  ...
end

奇怪的是,我在'taggings'表中获得重复行,其中第一行'tagger_id'和'tagger_type'设置为NULL,而重复行具有正确的值。

我的Gemfile看起来像这样

gem 'rails', '3.2.8'
gem 'acts-as-taggable-on', '~> 2.3.1'

有没有人见过这种行为? 这是我的一个配置问题吗?

更新:看看控制台,我可以清楚地看到正在执行的两个事务,第一个是这样的:

SQL (0.6ms)  INSERT INTO "taggings" ("context", "created_at", "tag_id", 
"taggable_id", "taggable_type", "tagger_id", "tagger_type") VALUES (?, ?, ?, ?, ?, ?, ?)
[["context", "tags"], ["created_at", Thu, 27 Sep 2012 21:49:22 UTC +00:00], ["tag_id",
 12], ["taggable_id", 10], ["taggable_type", "Photo"], 
["tagger_id", nil], ["tagger_type", nil]]

很明显,tagger_id被设置为空以及tagger_type。

这里是一个完整的控制台输出,我已经分开线路来帮助阅读。 你会注意到两个单独的事务,第一个是有NULL值的插入,而第二个是最后一个,你会看到正确的。

开始POST“/ photo”for 127.0.0.1 at 2012-09-28 07:39:58 +0200通过PhotoController处理#以HTML格式创建参数:{“utf8”=>“✓”,“authenticity_token”=>“IOmnfDpU7V7vYw3h6RXXzXPsXf / B0fcVihXhb + S8JHU =“,”photo“=> {”url“=>”www.another.com/photo.jpg“,”title“=>”Another“,”tag_list“=>”a_tag“,”description“ =>“”,“private”=>“0”},“commit”=>“添加照片”}重定向到http://www.somedomain.com:3000/users/christiangiacomi

完成302发现在414毫秒(ActiveRecord:20.5ms)

用户负载(0.3ms)SELECT“users”。* FROM“users”WHERE“users”。“username”='christiangiacomi'LIMIT 1 ActsAsTaggableOn :: Tag Load(0.2ms)SELECT“tags”。* FROM“tags”INNER JOIN“taggings”ON“tags”。“id”=“taggings”。“tag_id”WHERE“taggings”。“taggable_id”IS NULL AND“taggings”。“taggable_type”='Photo'AND(taggings.context ='tags 'AND taggings.tagger_id IS NULL)

(0.1ms)开始交易

SQL(6.2ms)INSERT INTO“photos”(“created_at”,“description”,“favorite”,“private”,“title”,“updated_at”,“url”,“user_id”)VALUES(?,?,? ,?,?,?,?,?)[[“created_at”,Fri,28 Sep 2012 05:39:59 UTC +00:00],[“description”,“”],[“favorite”,false] ,[“private”,false],[“title”,“Another”],[“updated_at”,Fri,28 Sep 2012 05:39:59 UTC +00:00],[“url”,“http:/ /www.another.com/photo.jpg“],[”user_id“,1]]

ActsAsTaggableOn :: Tag Load(3.2ms)SELECT“tags”。* FROM“tags”WHERE(lower(name)='a_tag')ActsAsTaggableOn :: Tag Exists(0.1ms)SELECT 1 AS one FROM“tags”WHERE“tags “。”name“='a_tag'限制1

SQL(0.2ms)INSERT INTO“tags”(“name”)VALUES(?)[[“name”,“a_tag”]]

ActsAsTaggableOn :: Tag Load(0.1ms)SELECT“tags”。* FROM“tags”INNER JOIN“taggings”ON“tags”。“id”=“taggings”。“tag_id”WHERE“taggings”。“taggable_id”= 13 AND“taggings”。“taggable_type”='Photo'AND(taggings.context ='tags'AND taggings.tagger_id IS NULL)

ActsAsTaggableOn :: Tagging Exists(0.2ms)SELECT 1 AS one FROM“taggings”WHERE(“taggings”。“tag_id”= 16 AND“taggings”。“taggable_type”='Photo'AND“taggings”。“taggable_id”= 13 AND“taggings”。“context”='tags'AND“taggings”。“tagger_id”IS NULL AND“taggings”。“tagger_type”IS NULL)LIMIT 1

SQL(0.7ms)INSERT INTO“taggings”(“context”,“created_at”,“tag_id”,“taggable_id”,“taggable_type”,“tagger_id”,“tagger_type”)VALUES(?,?,?,?,? ,?,?)[[“context”,“tags”],[“created_at”,Fri,28 Sep 2012 05:39:59 UTC +00:00],[“tag_id”,16],[“taggable_id” ,13],[“taggable_type”,“Photo”],[“tagger_id”,nil],[“tagger_type”,nil]]

(4.1ms)提交事务

(0.1ms)开始交易

ActsAsTaggableOn :: Tag Load(0.2ms)SELECT“tags”。* FROM“tags”WHERE(lower(name)='a_tag')

ActsAsTaggableOn :: Tag Load(0.2ms)SELECT“tags”。* FROM“tags”INNER JOIN“taggings”ON“tags”。“id”=“taggings”。“tag_id”WHERE“taggings”。“taggable_id”= 13 AND“taggings”。“taggable_type”='Photo'AND(taggings.context ='tags'AND taggings.tagger_id IS NULL)

CACHE(0.0ms)SELECT“tags”。* FROM“tags”WHERE(lower(name)='a_tag')

ActsAsTaggableOn :: Tag Load(0.2ms)SELECT“tags”。* FROM“tags”INNER JOIN“taggings”ON“tags”。“id”=“taggings”。“tag_id”WHERE“taggings”。“taggable_id”= 13 AND“taggings”。“taggable_type”='Photo'AND(taggings.context ='tags'AND taggings.tagger_id = 1 AND taggings.tagger_type ='User')

ActsAsTaggableOn :: Tagging Exists(0.4ms)SELECT 1 AS one FROM“taggings”WHERE(“taggings”。“tag_id”= 16 AND“taggings”。“taggable_type”='Photo'AND“taggings”。“taggable_id”= 13 AND“taggings”。“context”='tags'AND“taggings”。“tagger_id”= 1 AND“taggings”。“tagger_type”='User')LIMIT 1

SQL(0.5ms)INSERT INTO“taggings”(“context”,“created_at”,“tag_id”,“taggable_id”,“taggable_type”,“tagger_id”,“tagger_type”)VALUES(?,?,?,?,? ,?,?)[[“context”,“tags”],[“created_at”,Fri,28 Sep 2012 05:39:59 UTC +00:00],[“tag_id”,16],[“taggable_id” ,13],[“taggable_type”,“Photo”],[“tagger_id”,1],[“tagger_type”,“User”]]

(2.4ms)提交事务


好的,这真的很奇怪,但我已经想出了如何避免这个问题。

我所做的第一件事是创建一个高峰解决方案来测试acts_as_taggable_on,这似乎工作。 它由两个模型类组成,就是这样......当我通过导轨控制台测试它时它就起作用了。

所以我添加了一个表单,就像我在我的Rails应用程序中进行测试一样...

我有一个这样的表单:

   <div>
      <%= form_for @photo, :html => { :class => "dialog" } do |f| %>

      ...

      <%= f.label :title%>
      <%= f.text_field :title, :class => "wide" %>

      <%= f.label 'Tags' %>
      <%= f.text_field :tag_list, :value => @tags %>

      ...

      <%= f.submit button_text(@photo), :class => "btn btn-large btn-primary" %>
      <%= f.submit "Cancel", :class => "btn btn-large"  %>
   </div>

当我实现这个并测试它时,我得到了一个'Can not mass assign:tag_list'

我阅读了关于Rails 3.2.3中关于批量分配的更改,并决定不妥协安全。

所以我加入了我的Photo模型类

 attr_accessible :tag_list

这解决了错误,但当我测试它时,我发现现在出现的重复行! 所以现在这个bug是可重现的!

我通过更改窗体来解决它,以便不将窗体绑定到Photo模型对象。

像这样:

<div>
   <%= form_tag({:controller => "photos", :action => "create"}, :method => "post", :class => "dialog") do %>

   ...

   <%= label_tag :title, 'Title'%>
   <%= text_field_tag :title, nil, :class => "wide" %>

   <%= label_tag :tag_list, 'Tags'%>
   <%= text_field_tag :tag_list, nil, :class => "wide" %>

   ...

   <%= submit_tag('Add', :class => "btn btn-large btn-primary") %>
   <%= submit_tag("Cancel", :class => "btn btn-large")  %>
</div>

我还删除了attr_accessible:tag_list,并修改了控制器以接受表单中的不同值。

@photo = current_user.photos.build(:title => params[:title],
                                   ...
                                   )
@user.tag(@photo, :with => params[:tag_list], :on => :tags)

这解决了问题!

我现在要试着去研究一下为什么会发生这种事情! :)


我知道这个问题现在已经过去了五年了,但是这仍然发生在Rails 5.1中,它的acts-as-taggable 4.0 ,我只是想说明如何解决这个问题。

这是一个非常简单的修复,在你的控制器中,你只需添加tag_list: []而不是:tag_list就像这样:

def photo_params
  params.require(:photo).permit(:title, tag_list: [])
end

这样Taggings在数据库中创建重复和空白Taggings ,并且可以使用form_for而不是form_tag

<%= form_for @photo do |f| %>
  <%= f.text_field :title %>
  <%= f.text_field :tag_list %>
  <%= f.submit %>
<% end %>
链接地址: http://www.djcxy.com/p/35935.html

上一篇: ruby on rails

下一篇: Rails rdoc Gem error/corruption issue