rails application_controller中的硬编码javascript

时间:2013-11-15 22:15:50

标签: javascript ruby-on-rails ruby-on-rails-3 rjs

在我的应用程序中,我有一个按钮,点击后会打开一个弹出窗口,在我的application_controller中,按钮定义如下,

{:text => 'Info', :path => Proc.new{ |x| info},
    :html => { :id => 'info' }}      

和在application_helper中我有一个将该哈希值转换为按钮的函数。我在proc in application_controller中定义了你看到的信息,如下所示:

def self.info

if some_conditions
  "javascript:  popUpInfoCenter('an_url'); return false;"
else
  "javascript:  popUpInfoCenter('other_url');return false;" 
end 

结束

我遇到的问题是在点击按钮后,会打开一个新的弹出窗口,这是所希望的行为。但是,包含该按钮的页面将呈现为带有“false”字样的空白页面。我希望页面在单击按钮后保持原样。我尝试使用:

view_context.link_to_function "javascript:  popUpInfoCenter('an_url'); return false;"

但是view_context和link_to_function都在轨道3.2.14中死亡。所以,如果您认为有更好的方法,请告诉我。

P.S:这是我能够修改的所有文件。

1 个答案:

答案 0 :(得分:0)

总的来说,将硬编码JS转换为Rails控制器与convention相反,如果您希望代码高效运行,则需要确保只部署每个文件以执行所需的操作


<强>的Ajax

从它的外观来看,我认为你需要看一下Ajax

Ajax基本上允许您向URL发送请求(控制器操作),并处理返回的值。语法如下:

#javascript
$.ajax({
    url: "your/url",
    success: function(data) {
        //stuff here
    }
    error: function(data) {
        //stuff here
    }
});

<强>代码

您想要基于变量加载表单

因此,我会通过Ajax请求的“data”配置将变量发送给操作。这将允许我们回应我们处理该请求所需的任何内容,我们可以使用Rails中的respond_to功能

#app/assets/javascripts/application.js
$("button").on("click", function(e) {
    e.preventDefault();
    $.ajax({
         url: "/your/controller/action",
         data: "your_url",
    });
});


#app/controllers/application_controller.rb
def your_action
    respond_to do |format|
         format.js
    end
end

#app/views/controller/action.js.erb
popUpInfoCenter(<%=j params[:data] %>);