在保存与HABTM一起使用的表单之前执行某些操作

时间:2009-11-19 02:03:25

标签: ruby-on-rails has-and-belongs-to-many

我目前有3张桌子。

代码段 标签 snippet_tags

我正在使用HABTM。

所以我做了一个表单来保存带有标签的代码段。关键字位于文本字段中,以逗号分隔。

我需要做的是从这个文本字段中取出字符串,循环关键字,检查它们是否存在,如果不存在,然后保存片段。

我尝试过使用before_save,但似乎并没有这样做..

所以,如果你能帮助我,那太好了!

非常感谢!

4 个答案:

答案 0 :(得分:2)

我认为JosephL的答案非常好。虽然,我会在snippets_controller操作中完成所有操作:

def create
  @snippet = Snippet.new(params[:snippet])

  @snippet.tags = params[:tags].split(',').collect { |tag| Tag.find_or_create_by_name(tag) }

  if @snippet.save
    # do something when successful
  else
    # do something when saving failed
  end
end

对于这个冗长的单行声明感到抱歉。 ; - )

我没有测试代码,但我希望它有效。
Tag.find_or_create_by_name将完全执行以下操作:当存在具有该名称的标记时,它将返回它,否则它将动态创建新标记并返回该标记。
这样,标记已经保存,之前您调用@snippet.save

请注意,我刚才假设你的变量和参数是如何命名的。

答案 1 :(得分:2)

以下是create方法的一个版本。主要变化不是创建Snippet_Tag。如果您的HABTM关联设置正确,那么您的代码段将包含一个标签集合,您可以将标签添加到该集合中。该集合将Snippet_Tag保留为ActiveRecord。有关HABTM关联的更多详细信息,请参阅rails associations guide

def create
  # Creating the snippet
  @snippet = Snippet.new
  @snippet.title = params[:snippet][:title]
  @snippet.content = params[:snippet][:content]

  # loop through the tags
  params[:snippet][:tags].split(',').collect do |tag_string|
    tag_string.strip!
    if tag_string.length > 0
      # Find or create tag
      tag = Tag.find_or_create_by_name(tag_string)

      # Add tag to tags collection
      @snippet.tags << tag
    end
  end

  if @snippet.save
    # do something when successful
  else
    # do something when saving failed
  end
end

答案 2 :(得分:1)

  1. 使用split将字符串分解为标记数组
  2. 按名称查找每个标记
  3. 如果未找到,则创建标记
  4. 将代码添加到代码段
  5. 保存代码段(在您的控制器中)
  6. 放入代码段模型的示例方法

    def add_tags(tag_list_string)
       tag_array = tag_list_string.split ','
       tag_array.each do |tag_name|
         tag = (Tag.find_by_name(tag_name) || Tag.create(:name => tag_name))
         self.tags << tag
       end
    end
    

答案 3 :(得分:0)

试试before_update