Rails - Как отличить вызов действия от разных страниц? - PullRequest
2 голосов
/ 04 июля 2010

У меня есть действие destroy, определенное для определенного ресурса. По завершении он использует файл rjs с визуальным эффектом для удаления ресурса со страницы, с которой он вызывается.

Моя проблема в том, что действие destroy можно вызывать из 2 разных шаблонов. И поэтому визуальный эффект должен быть разным, в зависимости от того, из какого шаблона он вызывается ... Есть ли способ сделать это ...?

1: Я полагаю, что один из способов сделать это - это действие destroy и действие destroy-variant, причем один шаблон вызывает действие destroy-variant, а другой - обычный. Тем не менее, я уверен, что это противоречит идее СУХОЙ. И если честно, я тоже не совсем уверен, как это сделать ... Будет ли работать :method => :delete, :action => :destroy-variant в параметрах URL?

2: Другой способ, который кажется мне возможным, это выяснить, какая страница вызывает действие, а затем, при необходимости, выдвинуть различные файлы rjs. Но я абсолютно не знаю, как определить, какая страница выполняет действие, вызывающее.

3: Последний способ - это переделать шаблоны / RJS, чтобы один и тот же визуальный эффект можно было применить к обоим шаблонам.

Буду признателен за совет! :)

1 Ответ

2 голосов
/ 04 июля 2010

Вы не упоминаете библиотеку JavaScript, которую вы используете. Это решение основано на jquery. Довольно просто сделать то, что вы хотите, используя всего одно действие destroy. Но я бы предложил другую технику. Я нахожу RJS довольно стеснительным. Перейти на JQuery Taconite плагин. Это все разметка, а не ... набор javascript, смешанный с erb, который менее привлекателен для глаз!

Так что теперь вместо вашего destroy.rjs у вас будет destroy.xml.erb. Прежде чем перейти к тому, что вам нужно, давайте посмотрим, какие изменения нужно внести для вашего действия destroy.

ДО:

   def destroy
        @model = Model.find(params[:id])
        @model.destroy

          respond_to do |format|
            format.html { redirect_to :action => :index }
            format.xml
          end
    end

ПОСЛЕ:

   def destroy
        @model = Model.find(params[:id])
        @model.destroy
        @template = params[:template]
          respond_to do |format|
            format.html { redirect_to :action => :index }
            format.xml
          end
    end

Добавьте именованный маршрут в ваши маршруты. Rb, чтобы упростить вещи:

map.destroy_using_template 'destroy/:id/:template', :controller => "controller", :action => "destroy"

По вашему мнению:

Добавьте плагин jquery taconite к заголовку в вашем <layout>.html.erb,

<%= javascript_include_tag "jquery.js", "jquery.taconite.js" %>

В представлении для шаблона 1:

Предполагается, что вы используете ссылку для удаления.

   <%= link_to "Delete", destroy_using_template_path(:id => "1", :template => "temp1"), :method => :delete, :confirm => "Are you sure you want to delete the record?" %>

и то же самое для шаблона 2:

Предполагается, что вы используете ссылку для удаления.

   <%= link_to "Delete", destroy_using_template_path(:id => "1", :template => "temp2"), :method => :delete, :confirm => "Are you sure you want to delete the record?" %>

Теперь в вашем destroy.xml.erb

<taconite>
    <% if @template=="temp1" %>
      <remove select="#template1" />
    <% elsif @template=="temp2" %>
      <remove select="#template2" />
    <% end %>

    <eval>
        //OPTIONAL: Execute some javascript here if you want. You can do most of the DOM modifications using taconite itself.
        alert("HEY!!!");
    </eval>
</taconite>

Разве это не легко сейчас? :)

Помните, что при использовании таконита вы должны убедиться, что код в destroy.xml.erb соответствует XML. Убедитесь, что вы закрыли все открытые теги. Подробнее о таконите читайте здесь: http://malsup.com/jquery/taconite/

Taconite реализует все обычные модификаторы DOM jquery в разметке и несколько дополнительных. Если вы хотите переключиться на javascript, вы можете легко сделать это, просто включив этот javascript в тег eval, как показано выше.

...