【问题标题】:How to accept comma-delimited list to build tags for model?如何接受逗号分隔的列表来为模型构建标签?
【发布时间】:2012-03-08 00:53:20
【问题描述】:

由于当前应用程序的灵活性有限,我将关闭acts_as_taggable_on。相反,我从头开始构建我的标签作为它们自己的模型。但是,我已经错过了表单的“@model.tag_list”方法,它会拆分以逗号分隔的用户输入并制作单独的标签。我的“可标记”模型是一个视频,我很好奇如何编写一个本质上可以像“tag_list”一样工作的方法?

例子:

<%= form_for @video do %>
  <%= f.text_field :tag_list %>
  ....

给定输入:"one, two, three" 将构建三个标签作为@video 的子项。

@video.tags.each do |tag|
  puts tag.name
end

=> one
two
three

编辑

我真的很喜欢 Tag 模型中的这个,以保持表单混乱我的控制器。也许作为自定义属性?也许视频模型会更有意义?我知道如何制作自定义方法来返回自定义数据,但不分配它。一些研究以这种方式指出我(尚未测试)

video.rb

def tag_list=value
  value.split(',').each do |tag|
    self.tags.build(:name => tag).save
  end
end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 model acts-as-taggable-on


    【解决方案1】:

    看来我的示例代码最终可以工作了

    video.rb

    def tag_list=value
      value.split(',').each do |tag|
        self.tags.build(:name => tag).save
      end
    end
    

    编辑

    还需要添加以使其在表单中工作:

    def tag_list
      self.tags.join(',')
    end  
    

    【讨论】:

    • 这对我不起作用 - 我在发布表单时收到“标签无效”错误。你能发布你的整个代码吗?谢谢。
    • @Anand 那是 4 年前的事了......但听起来你对 tag 的验证没有得到满足。
    【解决方案2】:

    您可以将 tag_list 保留为 Video 上的属性,然后在您的创建中您可以拥有类似的内容:

    def create
      @video = Video.new(params[:video])
      if @video.save
        params[:video][:tag_list].split(',').each do |tag|
          @video.tags.create_by_name(tag)
        end
      else
        render :new
      end
    end
    

    【讨论】:

    • 是的,但有没有办法将它移到模型中?我想让它远离我的控制器。特别是因为我还计划拥有其他类型的标签。所以会有tag_list、actor_list、director_list等……
    猜你喜欢
    • 1970-01-01
    • 2020-04-21
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    相关资源
    最近更新 更多