Ruby Rails:打开模式框 Link 不起作用更新:link_to_remote
Ruby on Rails: Open Modal Box Link doesn't work Update: link_to_remote
我想让我的页面打开模态弹出框,所以我将这个 link 添加到我的视图文件中:
<%= 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 打开模态框时,没有任何反应,也没有出现错误。
你能帮我看看我丢了什么吗?
更新:Link_to_remote问题
看来问题出在link_to_remote,因为我尝试渲染局部视图但没有成功,我也尝试使用直接视图但结果相同。所以我不知道为什么这个 link 不起作用,请注意我将它包含在控制器中:
include LinkPrivilege
helper_method('link_to','link_to_remote','link_present')
尝试创建 new_instant_discount.rjs。然后放在那里:
page.replace_html 'modal-box', :partial => 'instant_discount_form'
page << "Modalbox.show($('modal-box'), {title: ''});"
Could you please help me find out what I'm missing?
如果您没有看到任何结果,问题可能出在您的 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: ''}));
这可能有效也可能无效。我需要访问几个依赖项,包括您的 routes、controller 和 Modalbox 代码。
调试是否 a) 正在触发请求 & b) 正在处理请求的最佳方法是使用 developer console and 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.
--
系统
你的问题比没有直接接收数据更严重returns,你需要了解你的代码结构(几乎已经存在)。
<%= 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
具有如此多的依赖属性 - 如果您只更改应用程序的一部分,则必须更改其中的许多部分。 Rails 对 DRY (Don't Repeat Yourself) 影响很大,因此不建议调用 controller
和 action
等细节。
你的routing helpers (specifically, the 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) %>
现在,从路径助手的荒谬性来看,我相信您会明白您需要如何能够解决系统内的一些更深层次的问题。即,您要具体说明 controller/actions;数据对象需要 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 中使用 objects - IE 它们是在你的 model 中创建的,它可以然后在您的控制器中进行操作等...
我觉得你的控制器动作很粗略。
--
关于您的更新,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 %>
我想让我的页面打开模态弹出框,所以我将这个 link 添加到我的视图文件中:
<%= 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 打开模态框时,没有任何反应,也没有出现错误。
你能帮我看看我丢了什么吗?
更新:Link_to_remote问题
看来问题出在link_to_remote,因为我尝试渲染局部视图但没有成功,我也尝试使用直接视图但结果相同。所以我不知道为什么这个 link 不起作用,请注意我将它包含在控制器中:
include LinkPrivilege
helper_method('link_to','link_to_remote','link_present')
尝试创建 new_instant_discount.rjs。然后放在那里:
page.replace_html 'modal-box', :partial => 'instant_discount_form'
page << "Modalbox.show($('modal-box'), {title: ''});"
Could you please help me find out what I'm missing?
如果您没有看到任何结果,问题可能出在您的 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: ''}));
这可能有效也可能无效。我需要访问几个依赖项,包括您的 routes、controller 和 Modalbox 代码。
调试是否 a) 正在触发请求 & b) 正在处理请求的最佳方法是使用 developer console and 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.
--
系统
你的问题比没有直接接收数据更严重returns,你需要了解你的代码结构(几乎已经存在)。
<%= 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
具有如此多的依赖属性 - 如果您只更改应用程序的一部分,则必须更改其中的许多部分。 Rails 对 DRY (Don't Repeat Yourself) 影响很大,因此不建议调用 controller
和 action
等细节。
你的routing helpers (specifically, the 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) %>
现在,从路径助手的荒谬性来看,我相信您会明白您需要如何能够解决系统内的一些更深层次的问题。即,您要具体说明 controller/actions;数据对象需要 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 中使用 objects - IE 它们是在你的 model 中创建的,它可以然后在您的控制器中进行操作等...
我觉得你的控制器动作很粗略。
--
关于您的更新,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 %>