如何使用rails中的ajax将数据从控制器传递到视图

时间:2015-04-19 14:01:17

标签: javascript ruby-on-rails ajax coffeescript

我今天发布了两次相似的问题

how-to-use-local-or-instance-variable-in-ruby-code-in-coffeescript-in-haml-templ

ajax-in-rails-returns-alway-error-callback

我对这些问题感到困惑,请让我问一下。

我在haml中使用ajax从控制器重新加载一部分页面。

请参阅我的代码。

.html.haml

= render 'layouts/partial' #This is partial. I want to reload this part

:coffee
    $('input#field').change ->
        $.ajax
            url: '/posts/gaga'
            type: "POST"
            dataType: 'text'
            error: (jqXHR, textStatus, errorThrown) ->
                alert "error"
            success: (data, textStatus, jqXHR) ->
                alert "success"
                $('div.kore').html('#{ j( render( 'layouts/partial' ) )} ');

posts_controller.rb

def gaga
    @model = Model.new("blabla")
    render :text => @model
end

_partial.html.haml

- if @model
    = @model.html_safe
- else
    = "No data"

首先,我认为数据可以从控制器获取@model实例变量,但它无法实现。

其次,我尝试使用jQuery从ajax响应数据中获取数据以查看(_partial.html.haml)。

回调和响应以文本形式正确返回。

如何从ajax响应数据传递数据以查看,还是有其他方法?

抱歉我的草率英语。我希望有人能给我一些线索。

提前致谢!

1 个答案:

答案 0 :(得分:2)

您可以将ajax请求设置为/posts/gaga.json,并在控制器的gaga方法中设置:

respond_to do |format|
  format.html
  format.json { render :json => @model }
end

如果您打算不通过ajax访问gaga.html.haml,或者只想删除/posts/gaga,则可能需要准备format.html视图文件。


为了澄清,我看到你想在ajax请求之后重新加载部分。所以而不是:

$('div.kore').html('#{ j( render( 'layouts/partial' ) )} ');

你可以这样做:

# inside gaga methods
format.json do
  render(json: {
    view: render_to_string(partial: 'layouts/partial', layout: false)
  })
end

现在在您的视图中:

= render 'layouts/partial' #This is partial. I want to reload this part

:coffee
  $('input#field').change ->
    $.ajax
      url: '/posts/gaga.json'
      type: "POST"
      error: (jqXHR, textStatus, errorThrown) ->
        alert "error"
      success: (data, textStatus, jqXHR) ->
        alert "success"
        $('div.kore').html(data.view)