2

Rails 4 アプリ (microposts モデル) に act_as_taggable を実装しようとしていますが、プログラムはタグを保存していないため、表示できません。タグとタグ付けのテーブルは収集され、データベースに存在しますが、フォームが送信されたときにタグを保存したりタグを作成したりするコードは実装されていないようです。このチュートリアルの手順をほぼ正確に実行しましたが、何かがうまくいかないようです。

それがRails 4中心の問題なのか、Railsで使用される「attr_accessible」コードの欠如に関連しているのかはわかりません。コード例では microposts テーブルへの追加が指定されていないため、接続が別の場所で行われていると想定することしかできませんが、どこをどのように修正すればよいかわかりません (おそらく 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

<%= 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>

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
...

ルート.rb

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

2 に答える 2

4

私が質問を正しく理解していれば、基本的に、acts-as-taggable gem について 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 ファイルに 1 つ追加することもできます。次の行を置き換えます。

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

と:

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

これらの提案がうまくいくかどうか教えてください。幸運を!

于 2013-11-29T19:11:22.133 に答える
0

フォーム内のタグの入力変数は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 %>

また、tags_list_micropost.erb.htmlを使用するように更新します。

または、 with モデルを更新して、代わりにタグ属性を使用することもできます'acts_as_taggable_on :tag

于 2013-10-24T04:31:56.237 に答える