2013-12-10 31 views
0

这是我的问题: 我在我的网站上设置国际化(所以我们可以在页面上多次翻译文本)。我按照rails cast设置了一个可以管理翻译的页面,而不是手动编辑每个yml文件。Rails为redis条目创建删除链接

我已经设置了一切,并可以创建条目罚款,我想添加删除条目的能力,我打了一堵墙。我似乎无法正确设置链接从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 %> 

我也使用了与的link_to一会儿过这个post其链接到为什么删除链接/按钮应该是这样的形式,因为它是编辑DB所以它需要来临前而不是得到。我有点沮丧,因为这看起来像是一个非常简单的任务,但我遇到了一些困难,找到了有关我的特定问题的明确答案,特别是该链接的路由,用于redis条目而不是activerecord对象。

**也因为按钮的形式正在为每个条目的循环创建我应该可能有一个索引的形式命名,所以它是每个按钮特定的?

任何洞察力或链接将不胜感激。

感谢,

艾伦

+0

当u对删除每个条目的redis-key,为什么不为其创建新的路由+控制器操作?现在你可以使用正确的redis.key将帖子发送到新的动作 - 在这种方法中,你删除了密钥? delete_translation_path(key:your_key) – marvwhere

+0

这就是** Controller **代码是什么,这是我的控制器InternationalizationTranslationsController中的操作,应该是删除我想通过form_for按钮传递的密钥。 在我的路线中,我有资源:internationalization_translations正在为其他窗体工作,这是创建操作。出于某种原因,我无法弄清楚如何让它使用destroy操作并将密钥作为参数[:key]发送(如上所示,从我尝试设置form_for链接的不同方式) –

+0

删除“key-选项“,然后在按钮之前/之后添加一个”hidden_​​field_tag:key,key“,然后重试。 – marvwhere

回答

0

好了,所以我最终想出来的复位一些东西,并采取marvwhere的建议。我想将它设置为没有窗体的链接,它是如何为其他正在操作活动记录对象的控制器生成的。但是,由于这是一个不同于默认销毁行为的自定义操作。

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

,然后调用该对象

TRANSLATION_STORE.del(params[:key])