2

所以这是我的观点,我尝试遵循一些教程并最终从http://8raystech.com/2011/11/28/how-to-create-embeddable-widgets-with-rails阅读所有参考资料

我花了将近 2 天的时间来寻找我显然在某个地方犯的小错误,因为我是 ruby​​ on rails 的新手。我认为这可能是一个路由错误,因为当我通过 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 %>)
})()

我认为部分并不重要,但这里有一个例子:(_embed.erb.html)

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

最后,在 routes.rb

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

所以我在本地进行了测试以使用以下方法加载我的小部件:

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

3 回答 3

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 逻辑。

于 2012-10-15T16:14:52.233 回答
2

好的,这是另一种方法...... JQuery和Json......

因此,直接使用像您的用户控制器这样的控制器或您想放入小部件中的任何信息,在我的示例中,是有关公司的一些信息。

所以在你的控制器中添加一个方法小部件,如:

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

在您的 routes.rb 中,您应该有类似的内容:

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

然后 JQuery 部分从第三方网站将使用的 JSON 信息生成 html 代码:首先是添加 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)

于 2012-10-16T08:45:01.407 回答
0

为什么要使用 render_to_string?您是否尝试过简单的渲染?

另外,也许尝试让您的 GET 调用将 .json 附加到 URL 的末尾。

于 2012-10-15T15:59:42.500 回答