2012-10-15 82 views
2

因此,這裏是我的觀點,我試圖遵循一些教程,並從http://8raystech.com/2011/11/28/how-to-create-embeddable-widgets-with-railsRuby on Rails的/ JavaScript的小部件

閱讀所有中端引用我花了近2天尋找小錯誤,我明顯的地方做因爲我是紅寶石新手。 我想可能是因爲當我透過Chrome檢查元素的路線錯誤,我看到以下錯誤: 編輯:

"GET http://localhost:3000/widget 500 (Internal Server Error)" 

我試過了很多東西拼命,但這裏是我當前的代碼:

我的小部件控制器看起來是這樣的:(widget_controller.rb)

class WidgetController < ApplicationController 
    def show 
     @content = render_to_string(:partial => 'widget/embed', :layout => false) 
    end 
end 

我的看法使用JavaScript(show.erb.html)

(function() { 
    document.write(<%= @content.to_json %>) 
})() 

的部分是不是真的很重要,我認爲,但這裏有一個例子:在routes.rb中(_embed.erb.html)

<style>...</style> 
<div class="widget-communication"> 
    <div>Bla bla bla</div> 
    ... 
</div> 

,並在過去,

... 
match 'widget', to: 'widget#show' 
... 

所以我在本地測試,以此來加載我的插件:

<script src="http://localhost:3000/widget" type="text/javascript"></script> 
+0

如果你試圖通過瀏覽器打開http:// localhost:3000/widget,會發生什麼? – Gabber

+0

它把: '模板丟失 缺少模板插件/顯示,應用/顯示含{:區域設置=> [:FR],:格式=> [:HTML]:處理程序=> [:ERB,:建築師,:咖啡,:haml]}。搜查:* 「/Users/....../rails/application/app/views」 *「/Users/....../.rvm/gems/[email protected]/寶石/ devise_invitable-1.1.0 /應用/視圖 「*」 /Users/....../.rvm/gems/[email protected]/gems/devise-2.1.2/app/views 「' – kulssaka

+0

http://stackoverflow.com/questions/6495046/template-is-missing – Gabber

回答

1

好了,所以這裏是另一種方式來做到這一點... JQuery的和JSON ....

因此,使用直接用於像你的用戶控制器或任何信息的控制器,你希望把你的widget,在我例如,一些關於公司的信息。

所以在您的控制器添加一個方法部件,如:

def widget 
    @company = Company.find(params[:id]) 
    @logo_url = @company.logo_url(:mini) 
    respond_to do |format| 
     format.json { render :json => {:company => @company, :url => @logo_url}, :callback => params[:jsoncallback] } 
    end 
    end 

在你的路由。RB那麼你應該有一些與此類似:

resources :public_company_profiles do 
    get :widget, on: :member 
    end 

然後JQuery的部分使你的HTML代碼從您的JSON信息的第三方網站將使用: 首先,腳本中加入了jQuery,那麼實際的jQuery請求。

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script> 
<script> 
$.getJSON("http://www.yourwebsite.com/yourcontroller/ID/widget?jsoncallback=?", 
    function(data) { 
    var logo_url = "http://www.yourwebsite.com" + data.url; 
    $("#logo img").attr('src',logo_url); 
    $("#logo img").attr('alt',data.company.name); 
    $("#name").html(data.company.name); 
    $("#desc").html(data.company.description); 
    }); 
</script> 

然後它工作的寶貝! (別忘了把這些和jQuery文檔放在這裏:api.jquery.com/html)

+0

這是更好的方法伴侶!你可能想放棄respond_to塊並使用'render:json' – Eru

0

你爲什麼USI ng render_to_string?你試過簡單的渲染?

此外,也許嘗試讓您的GET調用追加.json到URL的末尾。

+0

render_to_string這裏用來傳遞部分嵌入文本通過在第三方網站的JavaScript渲染 我不太清楚,你要我。追加'.json' 我試圖把它放在我的GET調用中,其後跟着沒有結果。 '?不工作 – kulssaka

+0

關於render_to_string我可以選擇不使用它,並直接用javascript中的document.write編寫,但我更願意分開這些文件。我也檢查@content的內容,並且它確定:) I遵循這一這樣選擇: http://aymeric.gaurat.net/2010/how-to-build-your-own-widget-in-ruby-on-rails-in-10-minutes/ – kulssaka

2

我不知道小部件,但它似乎你仍然想渲染部分作爲HTML不作爲JS。你只是分配一個字符串來賦值內容,並且它想要使用默認的渲染動作。嘗試使用不.erb但.js文件擴展名(show.js.erb),所以:在控制器

你還需要返回一個集合,即:

class WidgetController < ApplicationController 
    respond_to :js, only: :show 

    def show 
    @user = User.find params[:id] 
    end 
end 

,並在視圖( show.js.html):

document.write("<%= escape_javascript(render(:partial => 'widget/embed', :locals => {:user => @user})).html_safe) %>"); 

雖然我不建議使用respond_to :js。調試非常困難,速度很慢,它混合了html和js邏輯。

+0

他似乎很有趣,但我不明白爲什麼控制器需要返回一個集合。好吧,我想你的例子,但我得到:同樣缺少模板錯誤(我添加以下行到我的routes.rb還有:**匹配「插件/:身份證」,到:「小部件#秀」,ID :'。*/**和這個** resources:widget do member do get:user end end **)所以我不確定如何使用用戶,並且我不知道我可以返回什麼,不會與用戶和公司等集合進行交互... – kulssaka

+0

正如您所見,「@ user」是一個對象,而不是一個集合。我只是爲了這個目的而寫它。你也可以將動作定義爲'def show;',這樣它只會渲染一個視圖。你也可以命名你的控制器'WidgetsController'並創建如下的路由:'resource:widgets,只有:: show'而不是'match' – Eru

+0

嗯我看到:)我會記住這一點:)我投票+1即使我回答自己,也要回答。祝你有美好的一天 – kulssaka