我希望我的页面打开一个模态弹出框,所以我将此链接添加到我的视图文件中:
<%= 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')
答案 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 console和console.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很重,因此不建议调用controller
和action
等详细信息。
您最好使用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: ''});"