В моем приложении 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:in
show_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).
Также есть ли проблема с безопасностью, если я позволю пользователю перейти на страницу с уже открытым модальным окном?