Как отрендерить шаблон js из модуля, включенного в контроллер?

У меня есть действие в отношении контроллера, которое включается в контроллер. Это действие не отображает файл js.erb, как указано в блоке response_to. Как мне правильно получить действие в проблеме контроллера для успешного рендеринга файла js.erb (или любого представления, если на то пошло)? Это проблема с моими маршрутами?

Ссылка на действие модуля

= link_to image_tag("upvote.png"), 
send("vote_socionics_#{votable_name}_path", votable, vote_type: "#{s.type_two_im_raw}"),           
id: "vote-#{s.type_two_im_raw}",           
method: :post,          
remote: true

** Ссылка на действие контроллера **

= link_to "whatever", characters_whatever_path, remote: true

controllers / characters_controller.rb

class CharactersController < ApplicationController
  include SocionicsVotesConcern

  def an_action
    respond_to do |format|
      format.js { render 'shared/vote_socionics' }   # This renders/executes the file
    end
  end

контроллеры / проблемы / socionics_votes_concern.rb

module SocionicsVotesConcern
  extend ActiveSupport::Concern

  def vote_socionics
    respond_to do |format|
      format.js { render 'shared/vote_socionics' }   # This DOES NOT render/execute the file. Why?
    end
  end

end

просмотры / общий / любой.js.erb

  # js code that executes 

routes.rb

  concern :socionics_votes do
    member do
      post 'vote_socionics'
    end
  end

  resources :universes
  resources :characters,  concerns: :socionics_votes
  resources :celebrities, concerns: :socionics_votes
  resources :users,       concerns: :socionics_votes

person ahnbizcad    schedule 16.07.2014    source источник
comment
Вы пробовали расширить модуль от ApplicationController?   -  person G.B    schedule 16.07.2014
comment
если да, то включение модуля в качестве контроллера в контроллер не проблема? Это дало мне следующую ошибку wrong argument type Class (expected Module)   -  person ahnbizcad    schedule 20.07.2014


Ответы (2)


module SocionicsVotesConcern
  extend ActiveSupport::Concern

  included do 

    def vote_socionics
      respond_to do |format|
        format.js { render 'shared/vote_socionics' }
      end      
    end

  end

end

Оберните любые действия / методы, которые вы определяете в проблеме, в блок included do. Таким образом, все, что есть в блоке, будет считаться так, как если бы оно было записано непосредственно в объекте включения (то есть в контроллере, в который вы его смешиваете).

Благодаря этому решению нет свободных концов, идиосинкразии, никаких отклонений от рельсовых узоров. Вы сможете использовать respond_to блоков, и вам не придется иметь дело со странными вещами.

person ahnbizcad    schedule 20.07.2014
comment
В этом ответе должно быть больше объяснений. - person Dave Cousineau; 20.07.2014
comment
Вместо того, чтобы делать ответ на блок, вы просто визуализируете партиал. Я не знаю, доступны ли переменные из действия контроллера. Я почти уверен, что они съели с этим много слов и всякой всячины. Все, что я знаю, это сработало для этой конкретной цели рендеринга файла js. - person ahnbizcad; 20.07.2014
comment
Вы должны сказать это в самом ответе. - person Dave Cousineau; 20.07.2014
comment
обновление с лучшим ответом. - person ahnbizcad; 20.07.2014

Я не думаю, что это человек, совместимый с Rails.

  • Действие контроллера отображает представление или перенаправляет;
  • У модуля есть методы. Методы исполняют код;

Так что просто включение методов из модуля, названного контроллером, не сработает. Что вам действительно нужно сделать, так это вызвать действие от контроллера A к контроллеру B. Итак, SocionicsVotesController превратится в настоящий класс контроллера, и вы должны использовать redirect_to rails метод.

Вам нужно будет указать контроллер и действие, на которое вы перенаправляете, например:

redirect_to :controller => 'socionics', :action => 'index'

Или просто:

redirect_to socionics_url

По умолчанию будет отправлено HTTP 302 НАЙДЕНО.

ИЗМЕНИТЬ:

Если вы хотите повторно использовать способ реагирования вашего контроллера при использовании проблем с rails 4, попробуйте следующее:

class CharactersController < ApplicationController
  include SocionicsVotesControllerConcerns  # not actually a controller, just a module.

  def an_action
    respond
  end


module SocionicsVoteControllerConcerns
    extend ActiveSupport::Concern

    def respond
      respond_to do |format|
        format.html { render 'whatever' }
        format.json { head :no_content }
      end
    end
end

Мне удалось заставить его работать только при изменении format.js на format.html, возможно, из-за этого.

person Tiago Farias    schedule 16.07.2014
comment
Причина, по которой у меня есть модуль SocionicsVotesController, заключается в том, что он входит в три разных контроллера (с моделями) для полиморфной ассоциации. все связанные частные методы также войдут в каждый фактический контроллер. Стоит ли мне просто повторяться и вставлять их в каждый контроллер без модуля? Я чувствую, что этот шаблон рано или поздно появится, так что я могу научиться его делать прямо сейчас. - person ahnbizcad; 16.07.2014
comment
Разве не для этого были разработаны рельсы? - person ahnbizcad; 16.07.2014
comment
Конечно, опасения усиливают повторное использование кода. Но если вы хотите снова и снова отвечать одним и тем же ресурсом, возможно, вам стоит повторно использовать свой контроллер, а не писать 3 разных. Но, ладно ... дайте мне посмотреть, как вы можете использовать заботы, чтобы делать то, что вы пытаетесь сделать. - person Tiago Farias; 16.07.2014
comment
хрм это позор, потому что мне нужно, чтобы это был js для работы с ajax-y - person ahnbizcad; 17.07.2014
comment
Я понимаю. Но это все еще выполнимо. Но конечно, это другая проблема. - person Tiago Farias; 17.07.2014
comment
Нет, это на самом деле главная проблема. Ваш ответ отвечает на другую проблему - person ahnbizcad; 17.07.2014
comment
Полиморфная ассоциация подразумевает наличие нескольких ресурсов. Я не пишу 3 контроллера различий для того материала, который я помещаю в озабоченность.l, или для ресурса 1. Дело в том, чтобы добавить модуль беспокойства к контроллеру ресурсов, чтобы дать этому ресурсу некоторую функциональность. В этом весь смысл беспокойства. Я показал только один ресурс, потому что показывать больше не имеет отношения к проблеме. - person ahnbizcad; 17.07.2014
comment
Итак, все, что вам нужно, это просто заставить format.js работать внутри вашего модуля? - person Tiago Farias; 17.07.2014
comment
Позвольте нам продолжить это обсуждение в чате. - person Tiago Farias; 17.07.2014