2014-01-30 78 views
2

我有一个视图有一些动态分层选择(也就是说,第一个影响第二个可用选项)。刷新保持第一次选择的选项,但会从第二次选择中删除选项。我通过初始化第二个选择的onload来处理这个问题。目前我在[controller name] .js.coffee中有window.onload,但是onload会在我项目中的每个页面上运行。显然,这两个选择不在每一页上。我如何将它添加到需要它的页面?Rails:在哪里放置一个特定的视图

回答

2

对于这一点,我设立了控制器的名称和动作名称类的体ID在布局(application.html。*)

<body id="<%= controller_name %> class="<%= action_name %>"> 
    <%= yield %> 
</body> 

然后在您的controller.js文件,检查所需控制器和/或动作;

$(document).ready(function() { 
    if ($("#controller").length) { 
    // Your specific controller code here 
    } 
}) 

为PJAX用户注意:身体ID永远不会更新,你必须攻入pjax中间件 https://github.com/foohey/rack-pjax/commit/38caff53eec6a366aad3a2600d255529ebedfcc5#diff-2ae22cdf8106300731c4c37a3363ea48

+0

有没有什么方法可以将这部分用于部分?这是一个很好的解决方案,但我在application.html。*中有body标签来消除冗余,因此我不能添加id或class。 – Tyler

+0

您应该在您的布局中设置body ID(application.html。*) – m4tm4t

+0

我从未想过可能存在从视图访问控制器和操作名称的通用方法。谢谢。对于任何其他人这样做:[如何获取控制器/操作名称](http://stackoverflow.com/questions/3757491/can-i-get-the-name-of-the-current-controller-in-the-视图) – Tyler

0

我建立在badfoo的使用类,来保持命名空间的建议顶部的解决方案清洁。

我在根布局(application.html。*)中为body标签添加了“controller”和“action”属性。

然后,在application.js.coffee中,我做了一个onload函数来获取这些属性,检查一个类是否与控制器同名。 (因此,如果控制器是“客户端”,它将在js中寻找“客户端”类)。如果控制器类具有onload方法,则首先调用它。查找动作特定的onload的收益如下:它检查与动作名称相同的客户端子类。如果它存在并且有一个名为“onload”的方法,它会调用这个方法。如果操作的子类不存在,它会检查控制器类中名为“#{action} _onload”的方法并调用它。

window.onload =() -> 
    capitalize = (str) -> 
    str.charAt(0).toUpperCase() + str.slice(1) 

    controller = capitalize(document.body.getAttribute('controller')) 
    action = capitalize(document.body.getAttribute('action')) 

    controller_class = eval "#{controller}" 
    if controller_class? 
    action_class = eval "#{controller}.prototype.#{action}" 
    action_onload_func = eval "#{controller}.#{action}_onload" 
    controller_onload_func = eval "#{controller}.onload" 
    if action_class? and action_class.onload? 
     onload_func = action_class.onload 
    else if action_onload_func? 
     onload_func = action_onload_func 

    if controller_onload_func? 
    controller_onload_func() 
    if onload_func? 
    onload_func() 

需要注意的是这些类必须由用@符号为前缀来全球非常重要的。

相关问题