Nano Hash - криптовалюты, майнинг, программирование

Rails 4/UJS — ActionController::UnknownFormat — предоставляет пользователю возможность напрямую открывать страницу с уже открытым модальным окном

В моем приложении Ruby on Rails я использую Ajax через UJS Rails (ненавязчивый JavaScript).

Это отлично работает: когда пользователь находится на странице сделки, и когда он затем нажимает на определенную текстовую ссылку, выполняется вызов Ajax и загружается модальное окно с удаленным содержимым.

Но я хотел бы дать пользователям возможность попасть прямо на страницу С УЖЕ ОТКРЫТЫМ модальным окном, без необходимости загружать страницу сделки, а затем нажимать на текстовую ссылку. Например, пользователь может получить электронное письмо и щелкнуть по нему, и он сразу же попадет на страницу сделки с уже открытым модальным окном.

Но это не работает, когда я выбираю модальный маршрут (см. код ниже) и набираю в браузере http://myapp.com/deals/:id/deal_opportunities_modal , то выдает следующую ошибку:

Завершено 406 Not Acceptable за 29 мс

ActionController::UnknownFormat - ActionController::UnknownFormat: пакет действий (4.2.0) lib/action_controller/metal/mime_responds.rb:218:in respond_to' app/controllers/deals_controller.rb:70:inshow_opportunities'

Вот мои файлы:

контроллер/deals_controller.rb

# used so that old urls created for deals redirects to the new ones created
# indeed with friendly_id, the url is taken from the title :/deals/title
# but if we edit the deal title to deal/title2, the old url was still    working
# we need to redirect the old url
# source - github.com/norman/friendly_id/issues/385
before_filter :find_deal,
   :only => [  :showcase ]
before_filter :ensure_canonical_deal_path!,
  :only => [  :showcase ] 

def showcase    
    @deal = Deal.friendly.find(params[:id])   

    respond_to do |format|
      format.html # showcase.html.erb
      format.json { render json: @deal }
    end
end 

def show_opportunities
    @deal = Deal.friendly.find(params[:id])
    @opportunity = Opportunity.where('deal_id = ? AND deal_type = ?',
                             @deal.id, "high tech").first

    respond_to do |format|
      format.js
    end
end

protected

def find_deal
   @deal = Deal.friendly.find params[:id]
end
def ensure_canonical_deal_path!
   if request.path != deal_page_path(@deal)
        redirect_to deal_page_path(@deal, :format => params[:format]), :status => :moved_permanently
        return false
   end
end

app/views/deals/showcase.html.erb

<% if @deal.present? %>
   this is the beginning
   <%= render 'deals/deal_info_zone' %>
   this is the end
<% end %>

просмотры/сделки/_deal_info_zone.html.erb

<div id="zoneA">      
  <div style="color:red;padding-top: 150px;">
    <%= link_to "view infos of the latest Opportunity", deal_opportunities_modal_path, remote: true %>
  </div>
</div>

просмотры/сделки/deal_opportunities_modal.js.erb

Вот модальный триггер через Ajax: views/deals/opportunity_modal. Обратите внимание, как я пытался пройти здесь Deal, но безуспешно, так что линия

$('body').append('<%= j render partial: "deals/deal_opportunities_modal" %>');
$('#myModal').modal('show');

/app/views/deals/_deal_opportunities_modal.html.erb

Вот модальное представление/контент сейчас:

<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">

      <div class="modal-body"> 

          this the the latest opportunity: <%= @opportunity.name %> <br/>     

      </div>

    </div>
  </div>
</div>

маршруты.rb

match '/deals/:id', # this is the Deal page
    to:   'deals#showcase',
    via:  'get',
    as:   :deal_page

match '/deals/:id/opportunity_modal',
  to: 'deals#show_opportunities',
  via: 'get',
  as: :deal_opportunities_modal

Как этого добиться, то есть как создать маршрут/URL-адрес, по которому пользователь попадет на страницу сделки с уже открытым модальным окном show_opportunites.

Я слышал о js-маршрутах, но кажется, что это полезно для других целей (т.е. использовать маршруты Rails внутри файлов javascript).

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


Ответы:


1

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

Как я это вижу, поскольку у вас уже есть кнопка на странице сделок, которая открывает модальное окно, просто активируйте ее, если они нажмут на правильный URL.

Используйте маршрут с отдельным действием контроллера, которое вызывает одно и то же представление, сохраните переменную, чтобы указать представлению использовать модальное окно

Вот так:

  • Учитывая ссылку "/deals/24/opportunities" или любое другое соглашение об именах, создайте маршрут:

get '/deals/:id/opportunities', to: "deals#opportunities", as: deal_opportunities
  • В вашем контроллере создайте действие, которое использует то же представление, что и showcase, но передайте переменную в представление, чтобы проверить параметр, @show_modal = true

def opportunities
    @show_modal = true
    @deal = Deal.friendly.find(params[:id])
    respond_to do |format|
      format.html { render action: "/deals/show" }
    end
end
  • В вашем представлении showcase, если show_modal существует, используйте javascript, чтобы активировать кнопку, которая у вас уже есть в представлении, для вызова модального режима вручную.

<%= if @show_modal %>  
  <script type="text/javascript">
     $(window).load(function(){
        $("a.deals-button").trigger("click");
    });
  </script>
<% end %>
26.09.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..