【问题标题】:How do I create 'remove tag' links with Acts_As_Taggable_On in Rails?如何在 Rails 中使用 Acts_As_Taggable_On 创建“删除标签”链接?
【发布时间】:2012-04-07 15:56:24
【问题描述】:

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

添加项目,并为每个项目添加标签(在我的例子中是“types”/“type_list”)效果很好。我被困的地方是如何使用 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>

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

谢谢大家!

【问题讨论】:

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


    【解决方案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 %>
    

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

    【讨论】:

      【解决方案2】:

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

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

      更新了 projects 控制器 以查找当前项目,删除通过路由从索引视图传递的 :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!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-26
        • 2011-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-25
        • 2013-09-16
        相关资源
        最近更新 更多