使用acts_as_taggable在Ruby on Rails 4中保存标记时遇到问题

我正在尝试将act_as_taggable实现到我的Rails 4应用程序中(在微博模型上),但程序没有保存标签,因此无法查看。 标签和标签的表已经过调整并存在于数据库中,但是我提供的代码似乎都没有提交标签或在提交表单时创建标签。 我完全按照本教程中的步骤操作,但似乎没有用。

我不确定它是否是以rails 4为中心的问题和/或是否与rails中使用的’attr_accessible’代码缺乏有关。 由于代码示例没有指定向微博表添加任何内容,我只能假设连接是在其他地方进行的,但我应该在哪里以及如何修复我不知道的内容(在microposts_helper.rb中可能?)。

提前致谢。 任何帮助是极大的赞赏。

相关代码片段

的Gemfile

... gem 'acts-as-taggable-on', '~> 2.4.1' ... 

microposts.rb

  class Micropost < ActiveRecord::Base belongs_to :user acts_as_taggable acts_as_taggable_on :tags ... end 

microposts_controller.rb

  before_action :signed_in_user, only: [:create, :destroy] before_action :correct_user, only: :destroy def index if params[:tag] @microposts = Micropost.tagged_with(params[:tag]) else @microposts = Micropost.all end end def create @micropost = current_user.microposts.build(micropost_params) if @micropost.save flash[:success] = "Micropost created!" redirect_to current_user else @feed_items = [] render 'users/show' end end def destroy @micropost.destroy redirect_to user_url end def tagged if params[:tag].present? @microposts = Micropost.tagged_with(params[:tag]) else @microposts = Micropost.postall end end private def micropost_params params.require(:micropost).permit(:content) end def correct_user @micropost = current_user.microposts.find_by(id: params[:id]) redirect_to user_url if @micropost.nil? end end 

microposts_helper.rb

 module MicropostsHelper include ActsAsTaggableOn::TagsHelper end 

_microposts_form.html.rb

  ... 
...

_micropost.erb.html

 
  • ...
  • schema.rb

     ... create_table "microposts", force: true do |t| t.string "content" t.integer "user_id" t.datetime "created_at" t.datetime "updated_at" end add_index "microposts", ["user_id", "created_at"], name: "index_microposts_on_user_id_and_created_at" ... create_table "taggings", force: true do |t| t.integer "tag_id" t.integer "taggable_id" t.string "taggable_type" t.integer "tagger_id" t.string "tagger_type" t.string "context", limit: 128 t.datetime "created_at" end add_index "taggings", ["tag_id"], name: "index_taggings_on_tag_id" add_index "taggings", ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context" create_table "tags", force: true do |t| t.string "name" end ... 

    的routes.rb

     Dev::Application.routes.draw do ... resources :microposts, only: [:create, :destroy] ... match 'tagged', to: 'microposts#tagged', :as => 'tagged', via: 'get' end 

    如果我正确理解了这个问题,那么你应该做的就是告诉建议的params(strong_parameters)关于act-as-taggable gem的保护模型。 你已经半途而废了:

     private def micropost_params params.require(:micropost).permit(:content) end [...] end 

    只需添加:

     private def micropost_params params.require(:micropost).permit(:content, :tag_list => []) end [...] end 

    此外,您可能想要在routes.rb文件中添加一个东西。替换该行:

     resources :microposts, only: [:create, :destroy] 

    有:

     resources :microposts, only: [:create, :destroy, :tag] 

    让我知道这些建议是否有效。 祝好运!

    我认为,表单中标签的输入变量应该是tags_list 。 即

     <%= form_for(@micropost) do |f| %> ... 
    ... <%= f.label :tags %> <%= f.text_field :tags_list %>
    <%= f.submit "Post", class: "btn btn-large btn-primary" %> <% end %>

    并且还要更新_micropost.erb.html以使用tags_list

    或者您可以更新您的模型以使用标签属性,即'acts_as_taggable_on :tag