ruby on rails - कृतियों_स_टैग करने योग्य के साथ रेल 4 पर रुबी में टैग को सहेजने में समस्या




ruby-on-rails ruby-on-rails-4 (2)

मैं अपने रेल 4 ऐप (माइक्रोप्रोस्ट मॉडल पर) में act_as_taggable को लागू करने की कोशिश कर रहा हूं, लेकिन प्रोग्राम टैग सहेज नहीं रहा है, इसलिए यह देखने योग्य नहीं है। टैग्स और टैगिंग के लिए टेबल डेटाबेस में मौजूद हैं और मौजूद हैं, लेकिन कोई भी कोड मैं कार्यान्वित नहीं किया है, किसी भी टैग को सहेजते हैं या जब फॉर्म सबमिट किया जाता है तो कोई टैग बनाते हैं। मैंने इस ट्यूटोरियल के ठीक चरणों में कदम उठाया है, लेकिन कुछ काम करने में प्रतीत नहीं होता है।

मुझे यकीन नहीं है कि यह एक रेल 4 केंद्रित समस्या है और / या रेल में उपयोग किए गए 'एट्र्रे_अकेसेसिबल' कोड की कमी से जुड़ा है। चूंकि कोड का उदाहरण माइक्रोफ़ोस्ट तालिका में कुछ भी जोड़ना निर्दिष्ट नहीं करता है, इसलिए मैं केवल यह मान सकता हूं कि कनेक्शन कहीं और बना है, लेकिन मुझे और कैसे ठीक करना चाहिए कि मुझे नहीं पता है (शायद 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
...

routes.rb

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

अगर मैं इस प्रश्न को सही ढंग से समझता हूं, तो आपको सभी की ज़रूरत है, अनिवार्य रूप से, कार्य-के-टैग-योग्य मणि के बारे में पैरामीटर (मजबूत_परमेटर्स) के लिए सुझाए गए सुरक्षा मॉडल को बताएं। आपका पहले से ही आधे रास्ते यहां से है:

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]

मुझे ये बताएं कि क्या ये सुझाव चाल करते हैं सौभाग्य!


मुझे लगता है कि, फॉर्म में टैग के लिए इनपुट वैरिएबल को टैग_लिस्ट होना चाहिए। अर्थात

<%= 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 का उपयोग करने के लिए _micropost.erb.html भी अपडेट करें।

या फिर आप केवल अपने साथ एक टैग विशेषता का उपयोग करने के लिए मॉडल के साथ अपडेट कर सकते हैं अर्थात 'acts_as_taggable_on :tag '





acts-as-taggable