0

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

添加项目并为每个项目添加标签(在我的情况下为“类型”/“类型列表”)效果很好。我被困的地方是如何使用 Act_As_Taggable_On 删除单个标签。我想要的是能够单击每个标签旁边的“x”文本链接(请参阅链接)以从该项目 type_list 中删除标签。

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

project.type_list.remove("your tag")

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

我的控制器和模型代码非常简单和标准 - 基于 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>

谁能指出我正确的方向?我是否正确地实现了这一点,以便能够真正删除所描述的标签?

多谢你们!

4

2 回答 2

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 %>

当然你应该添加一些卫生,但它应该这样工作......

于 2012-04-07T16:06:53.017 回答
0

基于@Vapire 的建议代码 - 终于找到了一个可行的解决方案。只是对视图、路由和控制器进行了一些小的编辑。如果您在这里看到任何不可靠的东西,请告诉我 - 仍在尝试很好地掌握 Ruby/Rails,因此欢迎所有建议/重构想法。

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

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

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 参数:

<% 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!

于 2012-04-08T05:17:16.077 回答