jquery - 如何使用 link_to 和 rails 4.2.2 渲染部分

标签 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

我的链接在我的layouts/_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%>

我执行操作的 Controller 称为

LovelyController,bio action定义如下

//显示当前用户简介

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

最佳答案

从链接帮助程序中的 :remote => true 判断,听起来您正在尝试做的是在 Rails 中进行 AJAX 调用。你快到了;但是,您并没有完全按照 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'
})

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

app/views/lovelies/bio.js.erb1

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

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

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


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

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

关于jquery - 如何使用 link_to 和 rails 4.2.2 渲染部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36141326/

相关文章:

php - php 和 html 文件扩展名有什么区别?

ruby-on-rails - Rails 应用程序在 Heroku 中启动速度非常慢

sql - 将 Rails 迁移转换为原始 SQL

ruby-on-rails - 部署 :symlink on capistrano points the "current" directory to previous release

javascript - 索引号点击次数

jquery - 嵌套的 div 和移动列

javascript - 提交 HTML 表单之前的 Ajax(异步)

javascript - div 中的按钮都带有 onclick 事件 - 如何在单击按钮时仅触发两者之一?

jquery - 我的语法迭代字符串数组有什么问题?

html - 我如何为 div 中的链接添加不同的样式并向其添加类?