【问题标题】:Rails creating deletion link for redis entryRails为redis条目创建删除链接
【发布时间】:2013-12-10 22:17:20
【问题描述】:

这是我的问题: 我正在我的网站上设置国际化(因此我们可以对页面上的文本进行多种翻译)。我已经按照rails cast 设置了一个可以管理翻译的页面,而不是我必须手动编辑每个 yml 文件。

我已经设置好所有内容并且可以很好地创建条目,我正在尝试添加删除条目的功能,但我碰壁了。我似乎无法正确设置链接以从 redis 中删除条目。使这件事变得复杂的第一件事(至少对我而言)是我没有删除通过活动记录创建的对象(如用户等)。因此,我必须手动构造它,而不是使用活动记录对象来构造 link_to 或 form_for 的 url。

从我目前阅读的内容来看,我必须将链接放在一个表单中(并设置为发布,因为我们正在修改 redis 数据库)。所以我一直在尝试以标签的形式创建正确的语法,以指向我在控制器中设置的操作。

控制器:

class InternationalizationTranslationsController < ApplicationController
  def index
    @translations = I18n.backend.store
  end

  def create
      I18n.backend.store_translations(params[:locale], {params[:key] => params[:value]}, :escape =>false)
      redirect_to internationalization_translations_url, :notice => "Added translation"
  end

  def destroy
    puts "Key is:  #{params[:key]}"
    I18n.backend.delete(params[:key])
    redirect_to internationalization_translations_url, :notice => "Removed translation"
  end
end

查看:

<%= form_tag internationalization_translations_path do %>
  <p>
    <%= label_tag :locale %>
    <%= text_field_tag :locale %>
  </p>
  <p>
    <%= label_tag :key %>
    <%= text_field_tag :key %>
  </p>
  <p>
    <%= label_tag :value %>
    <%= text_field_tag :value %>
  </p>
  <p><%= submit_tag "Submit" %></p>
<% end %>
</div>
  <div class="grid_7 top_padding">
<table class="trans_table">
<% @translations.keys.each_with_index do |key, i| %>
<tr class="<%= i%2 == 0 ? "even" : "odd" %>">
  <td><%= key %></td>
  <td><%= @translations[key] %></td>

然后我使用 form_for 和 form_tag 查看文档(form helpersform tag docs)最终以这些结尾,但仍然无法正常工作:

    <%= form_tag(controller: "internationalization_translations", action: "destroy", method: "post", key: key) %>
    <%= submit "Delete" %>
    <% end %>

现在

    <%= form_tag(internationalization_translations_path, action: "destroy", method: "post", key: key) do %>
    <%= submit_tag "Delete" %>
    <% end %>

在遇到此post 之前,我还使用了 link_to 一段时间,这与为什么删除链接/按钮应该在表单中有关,因为它正在编辑数据库,因此需要发布而不是获取。我有点沮丧,因为这似乎是一项非常简单的任务,但我在找到关于我的特定问题的明确答案时遇到了一些困难,特别是针对 redis 条目而不是 activerecord 对象的此链接的路由。

**还因为按钮的表单是在循环中为每个条目创建的,所以我可能应该用索引命名表单,以便它特定于每个按钮?

任何见解或链接将不胜感激。

谢谢,

艾伦

【问题讨论】:

  • 当您拥有每个条目的 redis-key 时,为什么不为它创建一个新的路由+控制器操作?现在您可以使用正确的 redis.key 将帖子发送到新操作 - 在这种方法中您删除密钥? delete_translation_path(key: your_key)
  • 这就是 Controller 代码,这是我的控制器 InternationalizationTranslationsController 中的操作,它应该删除我试图通过 form_for 按钮传递的键。在我的路线中,我有资源:internationalization_translations 适用于另一种形式,用于创建操作。出于某种原因,我无法弄清楚如何让它使用销毁操作并将密钥作为参数发送 [:key](如上所示,我尝试设置 form_for 链接的不同方式)
  • 从 form_tag 中删除“key-option”,在按钮之前/之后添加一个“hidden_​​field_tag :key, key”,然后重试。

标签: ruby-on-rails redis form-for rails-i18n


【解决方案1】:

好的,所以我最终解决了一些问题,并接受了 ma​​rvwhere 的建议。我想将它设置为没有表单的链接,它是如何为其他正在操作活动记录对象的控制器生成的。但由于这是一种不同的情况,因此除了默认的销毁操作之外,还可以使用自定义操作。

      <%= form_tag(destroy_key_internationalization_translations_path, method: :post) do %>
      <%= hidden_field_tag 'key', key %>
          <%= submit_tag "Delete" %>
      <% end %>

我在 internationalization_translation 控制器中创建了 destroy_key 操作。

还需要更改从 redis 中删除密钥。我必须使用创建的实际 Redis 实例。所以不是

I18n.backend.delete(params[:key])

在我的初始化程序中,我必须在创建 Redis 实例时设置一个全局变量:

TRANSLATION_STORE = Redis.new(:db => 10)

然后对该对象调用 delete

TRANSLATION_STORE.del(params[:key])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 2014-04-14
    • 1970-01-01
    • 2023-04-01
    • 2020-10-01
    • 2023-01-06
    相关资源
    最近更新 更多