gpt4 book ai didi

javascript - Rails 4/UJS - ActionController::UnknownFormat - 为用户提供一种直接打开已打开模式的页面的方法

转载 作者:行者123 更新时间:2023-12-03 08:48:08 25 4
gpt4 key购买 nike

在我的 Ruby on Rails 应用程序中,我通过 Rails 的 UJS(不显眼的 JavaScript)使用 Ajax。

它工作得很好:当用户位于“交易”页面上,然后单击某个文本链接时,就会进行 Ajax 调用,并加载包含远程内容的模式。

但我想为用户提供一种方法,使其可以直接到达模式已打开的页面,而无需加载“交易”页面,然后单击文本链接。例如,用户可以收到一封电子邮件并单击它,他将立即到达交易页面,并且模式已打开。

但是当我采用模式路径(参见下面的代码)并在浏览器中输入 http://myapp.com/deals/:id/deal_opportunities_modal 时,它不起作用,然后它给出以下错误:

在 29 毫秒内完成 406 Not Acceptable

ActionController::UnknownFormat - ActionController::UnknownFormat: actionpack (4.2.0) lib/action_controller/metal/mime_responds.rb:218:in respond_to'
app/controllers/deals_controller.rb:70:in
show_opportunities'

这是我的文件:

Controller /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 %>

views/deals/_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>

views/deals/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,当用户使用该路由/URL 时,他会到达交易页面,并且模态“show_opportunites”已打开。

我听说过 js-routes,但它似乎对于其他目的很有用(即在 javascript 文件中使用 Rails 路由)。

如果我允许用​​户使用已打开的模式访问页面,是否还会存在安全问题?

最佳答案

您无法让浏览器打开仅可用作 JS 的 Controller 操作。

在我看来,由于您在交易页面上已经有一个打开模式的按钮,因此只要点击正确的 URL 即可触发它

使用具有调用同一 View 的单独 Controller 操作的路由,存储变量以告诉 View 使用模态

像这样:

  • 给定链接“/deals/24/opportunities”或任何其他命名约定创建一条路线:
<小时/>
get '/deals/:id/opportunities', to: "deals#opportunities", as: deal_opportunities
  • 在 Controller 中,创建一个使用与 showcase 相同的 View 的操作,但将变量传递给 View 以检查参数 @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 View 中,如果 show_modal 存在,则使用 javascript 触发 View 中已有的按钮来手动调用模式
<小时/>
<%= if @show_modal %>  
<script type="text/javascript">
$(window).load(function(){
$("a.deals-button").trigger("click");
});
</script>
<% end %>

关于javascript - Rails 4/UJS - ActionController::UnknownFormat - 为用户提供一种直接打开已打开模式的页面的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32797760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com