如何在Rails中使用Acts_As_Taggable_On创建“删除标记”链接?

时间:2012-04-07 15:56:25

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

我正在使用Act_As_Taggable_On gem创建一个简单的项目标记应用程序。

添加项目,并为每个项目添加标签(在我的案例中为'types'/'type_list')效果很好。我遇到的问题是如何使用Act_As_Taggable_On删除单个标签。我想要的是能够单击每个标记旁边的“x”文本链接(请参阅链接)以从该项目type_list中删除标记。

我搜索了文档并找到了一个方法:

project.type_list.remove("your tag")

但我需要帮助的是如何在特定标记上调用remove方法,特别是因为整个事情都是用.each进行迭代

我的控制器和型号代码非常简洁和标准 - 基于Act_As_Taggable_On文档。这是我在上面生成布局的视图代码:

<h1><%= @title %></h1>
<div class="column-left">
  <% @projects.each do |project| %>
    <div class="p_wrapper">

      <table>
        <tr>
          <td><div class="project p_name"><%= project.name %></div></td>
          <td><div class="p_link"><%= link_to 'Edit', edit_project_path(project) %></div></td>
          <td><div class="p_link"><%= link_to 'Nuke', project, :confirm => 'Are you sure?', :method => :delete %></div></td>
        </tr>
      </table>

      <table>
        <tr>
          <td>
              <% project.type_list.each do |tag|%>
                <div class="p_tag">
                <%= tag %> 
                <%= link_to "x", # %> <!-- THIS IS THE PART I'M STUCK ON -->
              </div> 
              <% end %>
            </td>
        </tr>
      </table>

      <table>
        <tr>
            <td>
              <%= form_for(project) do |f| %>
              <%= f.text_field :inject_tags %>  
              <%= f.submit "Add Tag" %>
              <% end %>
            </td>
        </tr>
      </table>

    </div>

  <% end %>

  <br />

  <%= link_to 'Add new project', new_project_path %>
</div>

有人能指出我正确的方向吗?我是否正确实现了这一点,以便能够按照描述实际删除标签?

谢谢你们!

2 个答案:

答案 0 :(得分:1)

我只是向项目控制器添加一个新方法,如下所示:

def remove_tag
  Project.find(params[:id]).type_list.remove(params[:tag])
end

并在您的路线文件中

resources :projects do
  member do
    put 'remove_tag', :as => :remove_tag
  end
end

在你看来

<%= link_to 'x', remove_tag_project_path(project), :tag => tag, :method => :put %>

当然你应该添加一些卫生设施,但它应该以这种方式工作......

答案 1 :(得分:0)

根据@ Vapire建议的代码 - 终于找到了一个有效的解决方案。只是对视图,路径和控制器进行一些小的编辑。如果你在这里看到任何狡猾的东西,请告诉我 - 仍然想要很好地掌握Ruby / Rails,以便欢迎所有的建议/重构想法。

更新后的测试网站位于project-list.heroku.com。

更新项目控制器以查找当前项目,删除:从索引视图通过路径传递的标记:

def remove_tag
  @project = Project.find(params[:id])
  @project.type_list.remove(params[:tag])
  @project.save
  redirect_to projects_path, :flash => { :success => "Updated - tag nuked."}
end

更新路线:

resources :projects
match 'projects/:id/remove_tag/:tag' => 'projects#remove_tag'

更新了link_to'x'代码以传递:tag params通过上面更新的路线:

<% project.type_list.each do |tag|%>
  <div class="p_tag">
    <%= tag %> 
    <%= link_to 'x', {:action => "remove_tag", :id => project.id, :tag => tag, 
    :controller => "projects"} %>
  </div> 
<% end %>

这对我来说显然是个新的理由,如果您有不同/更好的方法来解决这个问题,请与我们联系!另外,感谢您的帮助@Vapire!