我想让我的用户点击其个人资料页面中的“生物”链接,该链接将显示从数据库中提取的生物内容。 为此,我创建了一个部分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的新手,非常感谢有关如何解决此问题的建议和指导。
感谢
答案 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)
找到一个简单的解决方案
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()
我认为这很简单。