我正在尝试学习如何在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提供的标记功能?如果我可以在控制台中执行它,那么我应该能够在代码中执行它 - 但我完全不清楚如何实现它。
答案 0 :(得分:1)
def proposal_params
params.require(:proposal).permit(:title, randd_maturity_list: [], randd_field_list:[]
end
您需要允许列表参数作为数组,并使表单上的标记列表字段传递数组而不是文本