Rails создает ссылку на удаление для записи Redis

Вот моя проблема: я настраиваю интернационализацию на своем сайте (чтобы мы могли иметь несколько переводов текста на страницах). Я следил за приведением рельсов, чтобы настроить страницу, которая может управлять переводами вместо мне приходится вручную редактировать каждый файл yml.

Я все настроил и могу нормально создавать записи, я пытаюсь добавить возможность удалять запись и упираюсь в стену. Я не могу правильно настроить ссылку, чтобы удалить запись из Redis. Первое, что усложнило это (по крайней мере, для меня), это то, что я не удаляю объект, созданный с помощью активной записи (например, пользователя и т. д.). Поэтому вместо использования объекта активной записи для создания URL-адреса для link_to или form_for мне приходится создавать его вручную.

Из того, что я прочитал до сих пор, я должен поместить ссылку в форму (и настроить ее для публикации, поскольку мы модифицируем базу данных 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_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 который связан с тем, почему ссылка/кнопка удаления должна быть в форме, потому что она редактирует БД, поэтому ее нужно было опубликовать, а не получить. Я немного расстроен, потому что это кажется довольно простой задачей, но я сталкиваюсь с некоторыми трудностями при поиске четкого ответа относительно моей конкретной проблемы, в частности, маршрутизации для этой ссылки для записи Redis, а не для объекта activerecord.

** также, поскольку форма для кнопки создается в цикле для каждой записи, мне, вероятно, следует иметь форму с индексом, чтобы она была специфичной для каждой кнопки?

Любое понимание или ссылки будут с благодарностью.

Спасибо,

Алан


person Alan DeLonga    schedule 10.12.2013    source источник
comment
когда у вас есть ключ redis для каждой записи, почему вы не создаете для него новое действие маршрут+контроллер? теперь вы можете отправить сообщение в новое действие с правильным ключом redis.key - и в этом методе вы удалите ключ? delete_translation_path(ключ: your_key)   -  person marvwhere    schedule 11.12.2013
comment
Это и есть код Controller, то есть действие внутри моего контроллера InternationalizationTranslationsController, которое должно удалять ключ, который я пытаюсь передать через кнопку form_for. В моих маршрутах у меня есть ресурсы :internationalization_translations, которые работают для другой формы, которая переходит к действию создания. По какой-то причине я не могу понять, как заставить его использовать действие уничтожения и отправить ключ в виде параметра [: ключ] (как показано выше из разных способов, которыми я пытался настроить ссылку form_for)   -  person Alan DeLonga    schedule 11.12.2013
comment
удалите key-option из form_tag и добавьте hidden_field_tag ​​:key, key до/после кнопки, а затем повторите попытку.   -  person marvwhere    schedule 11.12.2013


Ответы (1)


Итак, в итоге я понял это, сбросив некоторые настройки и прислушавшись к совету marvwhere. Я хотел настроить его как ссылку без формы, как она генерируется для других контроллеров, которые манипулировали активными объектами записи. Но поскольку это был другой случай, сработало пользовательское действие, отличное от действия уничтожения по умолчанию.

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

где я создал действие destroy_key в контроллере internationalization_translation.

Также необходимо изменить удаление ключа из redis. Мне пришлось использовать фактически созданный экземпляр Redis. Итак, вместо

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

в моем инициализаторе мне пришлось установить глобальную переменную при создании экземпляра Redis:

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

а затем вызовите удаление этого объекта

TRANSLATION_STORE.del(params[:key])
person Alan DeLonga    schedule 12.12.2013