Ruby on Rails:Open Modal Box Link不起作用更新:link_to_remote

时间:2015-10-01 07:48:18

标签: javascript jquery ruby-on-rails ruby link-to-remote

我希望我的页面打开一个模态弹出框,所以我将此链接添加到我的视图文件中:

  <%= link_to_remote '+ Add Discount', :url => {:controller => "parent_wise_fee_payments", :action => "new_instant_discount", :id => @financefee.id, :current_action => @target_action, :current_controller => @target_controller} %>

并在控制器中:

def new_instant_discount
    @financefee=FinanceFee.find(params[:id])
    @target_action=params[:current_action]
    @target_controller=params[:current_controller]
    @finance_fee_category=@financefee.finance_fee_collection.fee_category
    respond_to do |format|
      format.js { render :action => 'create_instant_discount' }
    end
  end

然后我使用以下代码创建了create_instant_discount操作和create_instant_dicount.rjs:

page.replace_html 'modal-box', :partial => 'instant_discount_form'
page << "Modalbox.show($('modal-box'),  {title: ''});"

创建了我要打开的部分视图_instant_discount_form。

这里的问题是,当我点击链接打开模态框时,没有任何反应,也没有错误出现。

你能帮我找一下我错过的东西吗?

更新:Link_to_remote问题

似乎问题在于link_to_remote,因为我尝试渲染部分视图并且它不起作用,我也尝试使用直接视图但它给出了相同的结果。所以我不知道为什么这个链接不起作用,请注意我把它包含在控制器中:

  include LinkPrivilege

  helper_method('link_to','link_to_remote','link_present')

2 个答案:

答案 0 :(得分:1)

  

你能帮我找一下我错过的东西吗?

如果您没有看到任何结果,则问题可能出在client-side JS上。

Rails无法为您打开模型,必须使用服务器返回的数据将其附加到DOM。您似乎已将请求发送到服务器了,只是将其返回并附加到DOM

<强>代码

目前的代码非常随意,这就是我用提供的所做的

#app/views/controller/action.js.erb
$modalbox = $('modal-box');
$modalbox.html("<%=j render 'instant_discount_form' %>");
$('body').append(Modalbox.show($modalbox,  {title: ''}));

这可能有效,也可能无效。我需要访问多个依赖项,包括路由控制器 Modalbox 代码。

调试a)请求被激活的最佳方法&amp; b)正在处理的请求是使用developer consoleconsole.log输出:

#app/views/controller/action.js.erb
$modalbox = $('modal-box');
$modalbox.html("<%=j render 'instant_discount_form' %>");
$('body').append(Modalbox.show($modalbox,  {title: ''}));

console.log($modalbox); //checks if $('modal-box') is valid
console.log(Modalbox.show($modalbox,  {title: ''})); // checks if Modal being called correctly.

-

<强>系统

您的问题比不接收数据的直接回报要深刻,您需要了解代码的结构(几乎就在那里)。

<%= link_to_remote '+ Add Discount', :url => {:controller =>  "parent_wise_fee_payments", :action => "new_instant_discount", :id =>  @financefee.id, :current_action => @target_action, :current_controller => @target_controller} %>

首先,您的link_to_remote有很多依赖属性 - 如果您只更改了应用的一部分,则必须更改其中的许多内容。 DRY (Don't Repeat Yourself)上的Rails很重,因此不建议调用controlleraction等详细信息。

您最好使用routing helpers之一(特别是polymorphic path helper):

<%= link_to_remote '+ Add Discount', parent_wise_fee_payements_new_instant_discount_path(id: @financefee.id, current_action: @target_action, current_controller: @target_controller) %>

现在,从道路助手的荒谬,我相信你可以理解你需要如何解决系统中的一些更深层次的问题。也就是说,您要特定于您的控制器/操作;数据对象需要CRUD

#config/routes.rb 
resources :finance_fees do
   resources :discounts
end

#app/controllers/discounts_controller.rb
class DiscountsController < ApplicationController
   def new
      @finance_fee = FinanceFee.find params[:finance_fee_id]
      @discount = @finance_fee.discounts.new
   end
   def create
      @finance_fee = FinanceFee.find params[:finance_fee_id]
      @discount = @finance_fee.discounts.new create_params          
   end
   private
   def create_params
      params.require(:discount).permit(:x, :y, :z)
   end
end

我能看到的一个大问题是你将new_instant_discount称为动作,还有一堆其他高度调整的属性。虽然这没有什么不妥,但它否定了Ruby / Rails的核心方面之一 - 面向对象。

您打算在Rails中使用对象 - IE是在模型中创建的,然后可以在您的控制器等中操作......

你的控制器动作对我来说似乎很粗略。

-

关于您的更新,link_to_remote似乎已弃用,以支持remote RailsUJS功能:

<%= link_to "link", link_path, remote: true %>

这会将数据异步发送到您的服务器,它不会处理响应。如果您使用以下内容,它应该有效:

<%= link_to '+ Add Discount', :url => {:controller => "parent_wise_fee_payments", :action => "new_instant_discount", :id => @financefee.id, :current_action => @target_action, :current_controller => @target_controller}, remote: true %>

答案 1 :(得分:0)

尝试创建new_instant_discount.rjs。然后把它放在那里:

page.replace_html 'modal-box', :partial => 'instant_discount_form'
page << "Modalbox.show($('modal-box'),  {title: ''});"