我有一个rails应用程序,我试图让jQuery呈现一个
HTML文件.关键是jQuery是特定于页面的,所以我不希望它通过将它放在标题中来加载每个页面.这是我对文件所做的
messages_controller.rb
# GET /messages/new def new @message = Message.new @users = User.where('id != ' + current_user.id.to_s) #if @message.save #MessageMailer.new_message(@message).deliver respond_to do |format| format.html # new.html.erb format.js end #end end
/messages/new.html.erb
<div class="row"> <div class="large-12 columns"> <div class="panel"> <h1>New message</h1> <%= render 'form' %> <%= link_to 'Back',messages_path,:class => "button small" %> </div> </div> </div>
/messages/new.js.erb
$("h1").html('hello'); //for testing that it works
解决方法
为什么这不起作用?
我不认为你的方法是一种特别标准的方法来实现你想要的.你的JS模板没有被加载的原因是因为你的控制器被设置为响应HTML模板,如果浏览器请求HTML,以及JS模板,如果浏览器请求JS.它永远不会返回,因为浏览器只能请求其中一个.
换句话说,控制器中的respond_to块指示控制器如何响应不同类型内容的请求,而不是列出每个请求将要发送的所有类型的内容.
这里有几件事需要考虑.首先,仅仅因为JS没有在特定页面上使用,本身并不是加载它的好理由. Rails,通过Sprockets,将所有JS连接并缩小为单个文件.只要此文件没有更改,它就会被用户的浏览器缓存.当您的用户访问需要此JS的页面时,这将导致更快的响应,因为它不需要为获取新JS而发出额外请求.
如果你担心你的JS运行在它不应该运行的内容上,那么你应该通过向页面或页面添加一个唯一的标识符来防止这种情况发生,然后检测你的标识符. JS.例如:
$("h1.special").html('hello');
解决方案2:使用content_for
但是,在某些情况下,单独加载JS可能是有益的.在我看来,实现这一目标的最佳方法是,如果个人观点需要,可以使用块内容将内容附加到您的头上.
所以在你的应用程序布局中
#layouts/application.html.erb <head> #Other head content here <% if content_for?(:head) %> <%= yield(:head) %> <% end %> #Other head content here </head> #messages/new.html.erb <% content_for :head do $> <%= javascript_include_tag "messages_new.js" %> <% end %> #Other view stuff here #assets/messages_new.js $("h1").html('hello');
然后,messages_new.js将仅包含并因此在包含该content_for块的视图上运行.它不应出现在任何其他页面上.
解决方案3:只需在您的html中包含javascript即可
或者,如果你不关心JS是否最后加载,那么你可以在new.html.erb的底部添加include helper:
#messages/new.html.erb #Other view stuff here <%= javascript_include_tag "messages_new.js" %>