Rails 5 - 作为Taggable使用gem - 简单表单集合选择已定义的标记列表

时间:2017-01-13 05:33:23

标签: ruby-on-rails ruby forms simple-form acts-as-taggable-on

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

我使用简单的表格形式。我认为问题的一部分源于提案与randd_fields之间的模型没有关联。

我有名为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.text_field :randd_field_list, input_type: "textbox", name:"proposal[randd_field_list][]", html_options: { style: 'width: 100%' } %>


        <%= f.collection_select :randd_field_list, Randd::Field.order(:title), :id, :title, {}, {multiple: true} %>

第一个带注释的表单输入字段用于允许我输入标记。但是,标签是文本,我可以写任何我想要的东西。这不是我想要的。我希望标签的选择是:我的Randd :: Field模型中定义的:title属性。

我在下面尝试的第二个选项确实生成了一个列表,但是当我尝试将其保存为提案模型上的randd_field_list时,它会从Randd :: Field表中保存:id属性,而不是:title。< / p>

当我尝试从表单输入行删除:id组件时,出现错误:

{} is not a symbol nor a string

当我尝试从表单输入行删除{}时,出现错误说:

{multiple: true} is not a symbol nor a string

任何人都可以看到如何使用Acts作为Taggable在gem上,以便标签是从作为标记对象的模型中预定义的标题属性?我不想要自由格式标签。

提案控制器有:

def proposal_params
      params.require(:proposal).permit(:title, :description, :trl_id, randd_maturities_list: [], randd_field_list: [], randd_purposes_list: [], randd_activities_list: [],

Processing by ProposalsController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"Cy

然后在该区块中降低,这是我在表格中做出的选择:

"randd_field_list"=>"Aerospace Structures",

然后在那个区块的末尾:

Unpermitted parameters: randd_maturity_list, randd_field_list
   (0.1ms)  BEGIN

我尝试了其中的每一个 - 它们都不起作用。

 <%#= f.text_field :randd_field_list, input_type: "textbox", name:"proposal[randd_field_list][]", html_options: { style: 'width: 100%' } %>
        <%#= f.collection_select :randd_field_list, Randd::Field.order(:title),  :title, :title, input_html: { multiple: true } %>
        <%#= f.input 'randd_field_list',
       options_from_collection_for_select(@randd_fields, :title, :title),
       multiple: true %>
       <%#= f.collection_select 'randd_field_list',
      options_from_collection_for_select(@randd_fields, :title, :title),
      multiple: true %>
       <%= f.input :randd_field_list,:collection => @randd_fields,:label_method => :title,:value_method => :title,:label => "Fields" ,:include_blank => false, :multiple => true %>

最上面的一个用于为randd_field_list分配值,但它不允许在Randd :: Field表上使用我的预定义:title属性作为标记。

当我尝试保存表单时,其余的尝试会给出一个不允许的参数错误。

2 个答案:

答案 0 :(得分:1)

:id替换为:title

<%= f.collection_select :randd_field_list, Randd::Field.order(:title), :title, :title, {}, {multiple: true} %>

您希望将tag.title而不是id作为选定的选项值传递。 http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/collection_select

答案 1 :(得分:1)

解决

替换:id 同 :标题

像钟说的那样。

我认为你遇到的问题是因为你的代码是单数的。相反它应该是复数。 希望有所帮助