Rails 5 - 作为Taggable在gem定义的标记列表

时间:2017-01-12 21:45:35

标签: ruby-on-rails ruby associations acts-as-taggable-on

我正在尝试学习如何在Rails 5中使用Acts作为Taggable。

我有名为Proposal和Randd :: Field的模型。我正在尝试使用标签来标记提案,这些标签是:Randd :: Field表的title属性。

我的模特有:

提案

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 ::领域

(提案上没有关联)。

提案助手

module ProposalsHelper

     include ActsAsTaggableOn::TagsHelper

在我的提案表单中,我尝试添加标签:

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

在我的提案控制器中,我列出了一个randd_field_list数组(应该保存通过表单输入的每个标记)。

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

我可以通过控制台添加标签。我无法在提案表单中使用它。在控制台中我可以做到:

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

这可以将第一个和最后一个Randd :: Fields的标题添加到提案上的标记数组中。

但是,我无法弄清楚如何在表单中实现这一点。我在rails的控制台中没有显示任何错误。我不知道如何解决这个问题。

Acts as Taggable在gem文档中tutorial for editing tags - 它建议在Randd :: Fields控制器中添加更新方法,以便可以更新标记。接受这个建议后,我尝试将类似的动作添加到我的Randd :: FieldsController中:

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

这没有任何作用。我不确定它是否存在我没​​有标签控制器(根本没有)的问题,或者这是否是用于标记对象的所有控制器的通用标签。 Proposal控制器本身是否需要处理标签的创建和更新(对于我的情况,它是Randd :: Field模型中实例的标题?

任何人都可以看到我需要做什么才能使用此gem提供的标记功能?如果我可以在控制台中执行它,那么我应该能够在代码中执行它 - 但我完全不清楚如何实现它。

1 个答案:

答案 0 :(得分:1)

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

您需要允许列表参数作为数组,并使表单上的标记列表字段传递数组而不是文本