Mel
Mel

Reputation: 2685

Rails 5 - Acts as Taggable On gem - defined tag lists

I am trying to learn how to use the Acts as Taggable On gem with Rails 5.

I have models called Proposal and Randd::Field. I am trying to tag proposals with tags which are the :title attribute of the Randd::Field table.

My models have:

Proposal

class Proposal < ApplicationRecord

  acts_as_taggable_on :randd_maturities, :randd_fields, :randd_purposes, :randd_activities


# acts_as_taggable
# acts_as_taggable_on :skills, :interests

Randd::Field

(no association on Proposal).

Proposal helper

module ProposalsHelper

     include ActsAsTaggableOn::TagsHelper

In my proposal form, I try to add tags:

  <%#= f.select :tag_list %>
        <%#= f.input :randd_field_list,  collection: @randd_fields, label_method: :title,  include_blank: false %>
        <%= f.text_field :randd_field_list, input_html: {value: f.object.randd_field_list.to_s} %>

In my proposal controller, I have whitelisted an array of randd_field_list (which should hold each of the tags entered via the form).

def proposal_params
      params.require(:proposal).permit(:title,  :randd_maturity_list, :randd_fields_list, 

I can add tags via the console. I cannot get this to work in the proposal form itself. In the console I can do:

p = Proposal.first
p.randd_field_list = [Randd::Field.last.title, Randd::Field.first.title]
p.save

This works to add the title of the first and last Randd::Fields to the array of tags on the proposal.

However, I can't figure out how to achieve this in the form. I get no errors showing in the rails s console. I cant see how to figure this out.

The Acts as Taggable On gem documentation this tutorial for editing tags - it suggests adding an update method to the Randd::Fields controller so that the tag can be updated. Taking that advice, I've tried to add the similar actions to my Randd::FieldsController as:

def edit
end

    def update
  @randd_field_list = ActsAsTaggableOn::Randd::Field.find(params[:id])

  respond_to do |format|
    if @randd_field_list.update(randd_field_list_params)
      format.html { redirect_to root_path, notice: 'Tag was successfully updated.' }
      format.json { render :show, status: :ok, location: @randd_field_list.proposal }
    else
      format.html { render :edit }
      format.json { render json: @tag.errors, status: :unprocessable_entity }
    end
  end

This does nothing. I'm not sure if its a problem that I don't have a Tags Controller (at all), or if this is the generic label used for all controllers that are the tagging object. Is there anything required in the Proposal controller itself to handle the creation and updating of tags (which for my case are the titles of instances in the Randd::Field model?

Can anyone see what I need to do in order to use the tagging functionality provided by this gem? If I can do it in the console, it follows that I should be able to do it in the code - but its entirely unclear to me as to how to go about implementing this.

Upvotes: 1

Views: 814

Answers (1)

Zzz
Zzz

Reputation: 1703

def proposal_params
  params.require(:proposal).permit(:title,  randd_maturity_list: [], randd_field_list:[]
end

You need to permit list params as an array, and make the tag list field on form to pass an array instead of text

Upvotes: 1

Related Questions