我正在尝试在我的 Rails 4 应用程序中实现act_as_taggable(在微帖子模型上),但程序没有保存标签,因此无法查看。标签和标记的表已被倾斜并存在于数据库中,但是在提交表单时,我实现的任何代码似乎都没有保存标签或创建标签。我几乎完全按照本教程中的步骤操作,但似乎有些东西不起作用。
我不确定这是否是一个以 rails 4 为中心的问题和/或与 rails 中缺乏"attr_accessible"代码有关。由于代码示例没有指定向 microposts 表添加任何内容,因此我只能假设连接是在其他地方建立的,但是我应该在哪里以及如何修复我不知道的问题(也许在 microposts_helper.rb 中?
提前谢谢。任何帮助将不胜感激。
相关代码片段
宝石文件
...
gem 'acts-as-taggable-on', '~> 2.4.1'
...
微帖子.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
<%= form_for(@micropost) do |f| %>
...
<div class="field">
...
<%= f.label :tags %>
<%= f.text_field :tag_list %>
</div>
<%= f.submit "Post", class: "btn btn-large btn-primary" %>
<% end %>
_micropost.erb.html
<li>
<span class="content"><%= micropost.content %></span>
<span class="tags">
<%= micropost.tag_list %>
</span>
...
</li>
模式.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
...
路线.rb
Dev::Application.routes.draw do
...
resources :microposts, only: [:create, :destroy]
...
match 'tagged', to: 'microposts#tagged', :as => 'tagged', via: 'get'
end
如果我正确理解了这个问题,您需要做的就是,本质上,告诉 params(strong_parameters) 关于可标记宝石的推荐保护模型。 你已经走了一半:
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| %>
...
<div class="field">
...
<%= f.label :tags %>
<%= f.text_field :tags_list %>
</div>
<%= f.submit "Post", class: "btn btn-large btn-primary" %>
<% end %>
并更新_micropost.erb.html
以使用tags_list。
或者您可以更新您的模型以使用标签属性代替,即'acts_as_taggable_on :tag
"