将Rails对象传递给Javascript

时间:2012-06-28 04:30:28

标签: javascript ruby-on-rails

我已经和Rails合作了一段时间了。我找到了一些东西,但我正在努力解决这个问题。我有一系列博客文章,只用他们的标题呈现。在控制器中,对象看起来像:

@articles

在我的主页面上,我通过局部渲染它​​,只显示标题。

<%= render 'shared/article_view', :collection => @articles %>

这为我提供了主页上的文章列表。当我点击标题时,我想在单独的div中打开它。我有一个表格。但是,我不确定如何将参数传递给被调用的javascript。我假设我可以将id传递给我的view_article.js.erb文件,可以从那里调用

@article = Article.find_by_id(id)

然后

<p><%= @article.text %></p>

但是,我不知道如何将任何类型的参数传递给此文件。它可能甚至不起作用,我这样做可能完全错误。正如我所说,还在学习。无论如何,谢谢你的帮助!

2 个答案:

答案 0 :(得分:3)

我的语法可能有些偏差,但这就是我要做的事情:

<强> HTML

 <div data-id="<%= @article.id %>" class="article"><%= @article.title %></div>

<强> JS

这可能有助于解释你的js如何运作:http://guides.rubyonrails.org/asset_pipeline.html。我通常做的是创建一个对象,其中包含特定视图的所有绑定(和其他方法)。然后在视图中,在底部的某个地方,我将在文档就绪块中创建对象的实例并绑定DOM。所有js都将由清单文件(application.js)添加到您在布局中的任何位置。

应用程序/资产/ Javascript角/ users.js

// Wraps your binding in a document ready function
// Runs as soon as the DOM is loaded
$(function() {
  $('.article').on('click', function() {
    var id = $(this).attr('data-id');
    $.get('articles/' + id, function(data) {
      // Handle the result
      $('.article-window').html(data);
    });
  });
});

应用程序/资产/ Javascript角/ application.js中

  // This directive will include all your js files in the javascripts folder
  //= jquery
  //= require_tree .

app / views / layouts / application.html.erb(或布局所在的位置)

  // This adds all your js to the page
  <%= javascript_include_tag "application" %>

Rails控制器

class ArticlesController < ApplicationController
  respond_to :html, :json
  def show
    @article = Article.find(params[:id]
    respond_with do |format|
      format.json { render :json => @article }
    end
  end
end

答案 1 :(得分:0)

class ArticleController

def show
  @article = Article.find(params[:id]
  respond_to do |format|
    format.json {render :json => @article.text } #now when u try to get host/articles.json/[id of article] you will get json with article object
  end
end
article.js.erb中的

(我的例子中的coffe) 你可以使用http://js2coffee.org/将coffe转换为js article.js.coffee

$('document').ready ->
  $('.article').live 'click', ->
    $.ajax
      url: 'articles/' + $(this).attr('id') #getting article#show with id of article
      complete: (data) ->
        article = JSON.parse(data.responseText)
        $('p').empty()
        $('p').append(article.text)
像这样的事情 如果您有错误,请发送电子邮件至gq的antiqe