簡體   English   中英

為什么 rails 不渲染 .js.erb 文件?

[英]Why is rails not rendering the .js.erb file?

我有一個 rails 應用程序,我試圖在其中使用 HTML 文件渲染 jQuery。 關鍵是 jQuery 特定於頁面,所以我不希望它通過將它放在標題中來為每個頁面加載。 這是我對文件所做的

消息控制器.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

有什么我必須添加到另一個文件中的嗎? 是否有我必須提出的請求,以便它同時加載 HTML 和 .js?

為什么這行不通?

我不認為你的方法是完成你想要的特別標准的方法。 你的 JS 模板沒有被加載的原因是因為你的控制器設置為響應 HTML 模板,如果瀏覽器請求 HTML,如果瀏覽器請求 JS,則響應一個 JS 模板。 它永遠不會返回兩者,因為瀏覽器只能請求其中一個。

換句話說,您的控制器中的 respond_to 塊指示控制器如何響應對不同類型內容的請求,而不是在每個請求中列出將發送的所有內容類型。

解決方案1:在每個頁面上加載JS

這里有幾件事情需要考慮。 首先,僅僅因為 JS 不在特定頁面上使用,本身並不是不加載它的好理由。 Rails 通過鏈輪將所有 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 的底部添加包含幫助程序:

#messages/new.html.erb
#Other view stuff here
<%= javascript_include_tag "messages_new.js" %>

據我了解,您希望在請求 /messages/new 時提供 new.html 和 new.js。

這是行不通的,rails 控制器將使用 js 或 HTML,從不使用兩者。 HTTP 不是那樣工作的。 您只有一個響應 HTTP 請求而發送的文件,並且您不能同時發送 2 個。

action的respond_to塊的目的是為了html請求(經典瀏覽)使用html,請求js時使用js,這就是ajax使用的。

對於你想要的,你需要在你的erb中添加一個js引用,沒有其他方法。

抱歉,我遲到了,但您可以使用以下命令調用“/messages/new.js.erb”中的 JavaScript:

消息/new.html.erb

link_to "Link", "", remote: true

任何時候單擊該鏈接時,它都會觸發“/messages/new.js.erb”。

如果您將 html.erb 文件包裝在腳本標簽中,Javascript 代碼將從您的 html.erb 文件中運行。 如果它僅用於測試目的並且只是臨時的,那么這可能是一種使用 html 觸發 jquery 的快速簡便的方法,而不是創建一個新的單獨文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM