如何使用rails 4.2.2渲染部分使用link_to

时间:2016-03-21 20:50:16

标签: jquery html ruby-on-rails ruby ruby-on-rails-4

我想让我的用户点击其个人资料页面中的“生物”链接,该链接将显示从数据库中提取的生物内容。 为此,我创建了一个部分lovelies / _bio.html.erb,因为我想在他们的“个人资料页面”上加载“用户生物”,而不是将它们发送到另一个页面。

目前,部分无法找到。这是我的代码。

在我的routes.rb文件中,我为生物操作创建了一个url路径,转换为

    bio_lovely_path url -> /lovelies/:id/bio 

这是以这种方式完成的,因为我需要检索我作为成员创建它的特定用户的信息。

配置/ routes.rb中

resources :lovelies do
  member do
    get 'bio'
  end
 end

我的链接位于我的布局/ _header.html.erb

 if logged_in?
  <li class="header-log"><%= link_to "Bio", bio_lovely_path, :remote => true %></li>
else
//display none logged in links
 <%end%>

我操作的控制器名为

LovelyController,bio动作定义如下

//显示当前用户生物

    def bio
      @lovely = Lovely.find(params[:id])
      respond_to |format|
       format.js
      end
    end

我在我的lovelies.coffee文件中有一个jQuery调用,用于将lovelies / _bio.html.erb部分渲染到我的lovelies / show.html.erb中的div

    jQuery ->$('#partial).html '<%= escape_javascript(render 'bio') %>

我的输出显示抛出500错误 - 无法加载资源。

我的理解是jQuery将这个html添加到show.html.erb中的<div>,它将其作为ruby处理,并且应该导致呈现_bio.html.erb。 我是Rails的新手,非常感谢有关如何解决此问题的建议和指导。 感谢

3 个答案:

答案 0 :(得分:2)

听起来你要做的就是在Rails中进行AJAX调用,从链接帮助器中的:remote => true判断。你快到了;但是,你并没有完全按照Rails的预期进行操作。

当链接看起来像这样

= link_to 'Bio', bio_lovely_path(@lovely), :remote => true
# small change from the code you gave - because your path `lovelies/:id/bio` 
# has `:id` in it, you must provide the object you are referring to, `@lovely`.
# in fact, this is probably where your 500 error came from.
单击

,就像它触发一个AJAX调用一样:

// you don't have to write this; `:remote => true` ensures that it gets done 
// for you.
$.ajax({
    url: '/lovelies/<@lovely.id>/bio',
    type: 'get',
    dataType: 'script'
})

这会将您的lovelies#bio控制器操作作为数据类型js命中。通过告诉respond_to js格式,您做了正确的事情。这将允许它呈现js文件。也就是说,在控制器操作结束时,Rails将查找要执行的相应js.erb文件。 (通常,它会查找html.erb文件,但是您使用:remote => true告诉它这次使用JavaScript。)

应用/视图/ lovelies / bio.js.erb 1

$('#partial').html('<%= escape_javascript(render(partial: "bio.html.erb")).html_safe %>');

以前,您在lovelies.coffee中有大约此代码,但这不起作用。首先,Rails在控制器动作之后不会知道执行它。另一方面,assets文件夹中的文件在其ERB功能方面受到限制(尽管如果您为其提供.erb扩展名,它们可以做一点。)

1 如果您愿意,可以使用CoffeeScript .coffee.erb。但我不知道具体情况;我尽可能避免使用CoffeeScript。

现在我尝试在使用Rails :remote => true属性时解释AJAX过程,让我提出一个替代方案。我最近认识到,对于一项简单的任务,如在页面中插入更多元素,通常更容易将它们包含在一起。通过为容器提供display: none CSS属性来隐藏它们,然后在使用jQuery的.slideDown()或类似内容单击按钮时显示它们。它将允许您跳过路由,控制器操作,js.erb文件以及所有麻烦。

基本上,我建议(大多数时候)在Rails中保存花哨的AJAX调用,以便在需要删除,创建或更新时使用。当有一种更简单的方法时,动态地向页面添加一些额外信息通常是不值得的。

答案 1 :(得分:1)

部分应该在另一个文件中使用render partial: 'name_of_partial'呈现为不同页面的一部分。但是,您的控制器有一个bio方法,需要一个bio.html.erb文件,用于rails用于该路径上的主生物页面。请注意文件名开头没有下划线。

使用不同的页面并在其中呈现您的_bio.html.erb部分(并且没有单独的路径),或者拥有仅适用于bio的页面。

答案 2 :(得分:1)

找到一个简单的解决方案

  1. 创建一个容器来保存渲染的部分。
  2. 单击关联的ID后,使用Coffeescript事件触发部分呈现。
  3. html文件 - //按钮点击并在页面上显示生物

    <button id="display-bio">Lovely Bio </button>
    

    //在页面上显示生物的div

    <div id="bio" style='display:none'>
        <%= render 'layouts/bio'%>
    </div>
    

    coffeescript中的代码

    //用于触发事件的咖啡脚本中的代码

    $('#display-bio).click ->
        $('#bio).show()
    

    我认为这很简单。