2011-03-29 39 views
7

MyControllerfoo方法是通過Ajax調用,它可能會返回Javascript代碼是這樣的:Rails 3:如何從Controller發送Javascript代碼?

class MyController < ApplicationController 
    def foo 
    render :js => "alert('Hello');" 
    end 
end 

這有可能做類似返回時foo時(不通過Ajax),通常被稱爲一個Javascript代碼的東西嗎?我會這樣做:

class Job < ApplicationController 
    def edit 
    if user_type == 'demo' 
     [Here I would like to display a Javascript alert saying that 
     the job cannot be edited in demo mode. How would you do this?] 
    else 
     @job = Job.find(params[:id]) 
    end 
    end 
end 
+0

JS的格式你要反對的Rails的非標準使用和HTTP – fl00r 2011-03-29 14:19:58

回答

5

簡短的回答是:你不能。

當您渲染爲js時,調用代碼是一個javascript框架,它知道它請求了js並執行返回的代碼,以便在異步調用執行onSuccess操作時生效。

當爲默認渲染時,調用代碼是期望html的瀏覽器,它不會執行純js。

你可以做的是讓你的視圖返回HTML與JavaScript的一開始與一個window.onload()處理程序定義,使其顯示警報。但你仍然必須返回html(如果你不想顯示數據,使其重定向到具有特定參數的先前視圖模板,以便視圖將具有事件處理程序) (https://stackoverflow.com/questions/1033398/execute-javascript-when-page-has-fully-loaded

也可以更改調用編輯操作的事件處理程序,以便在執行操作之前顯示警報。爲了防止用戶禁用js並越過警報,您仍然需要對user_type進行檢查,並可能只是重定向到上一頁。

+0

他可以使用'渲染:update' – fl00r 2011-03-29 13:56:00

+0

按照我的理解的格式他的請求是_not_:js。它是html。在這種情況下:更新是沒用的,因爲我不認爲他可以渲染:更新格式:html,因此我的答案... – Jean 2011-03-29 14:15:43

+0

哦,我明白了。我錯過了這個問題的主要想法。 +1。他不能:) – fl00r 2011-03-29 14:18:55

3

我建議你保持控制器清潔放置任何JavaScript代碼在RJS模板:

控制器

class MyController < ApplicationController 
    def edit 
     render do |page| 
     page.html {} 
     page.js {} 
     end 
    end 
end 

edit.js.erb

alert("hello"); 

每當調用/my/edit/1.js(通過:edit_my_path(1, :format => :js))時,e dit.js.erb將呈現顯示警報。

每當調用/my/edit/1.js(通過:edit_my_path(1)),edit.html.erb將呈現爲顯示正常的html。

如果您需要檢查該請求是否是AJAX(因此不只是一個正常的.js調用),你可以在你的控制器做:request.xhr?

希望幫助!

+0

從問題:他想要這樣做,當請求是_not_ xhr ... – Jean 2011-03-29 14:20:47

+0

@jean雙向工作不是這樣。 – 2011-03-29 14:46:29

+0

從他想要的,它總是會調用正常的html(他說:不是xhr),因此它總是會顯示正常的html,無論user_type是演示還是不演示。他可能會在「顯示」模板頁面中使用條件檢查,並使用js格式進行user_type演示,但是您的答案中不清楚... – Jean 2011-03-29 14:53:59

0

你可以簡單地渲染JavaScript作爲文本時請求

class MyController < ApplicationController 
    def update 
     respond_to do |format| 
     format.html {} 
     format.js { render text: 'alert();' } 
     end 
    end 
end 
+0

這似乎給了一個ActionView :: MissingTemplate:缺少模板resource_name/alert(); – Magne 2017-09-12 13:23:06

相關問題