【问题标题】:Rails: Rendering partial in div on clickRails:点击时在div中渲染部分
【发布时间】:2013-06-20 20:20:47
【问题描述】:

我正在构建一个 Web 应用,它的 UI 分为两侧、一个菜单栏和一个内容区域。 菜单栏列出了用户撰写的所有博客的标题。单击标题时,内容区域应更改以显示该博客的帖子。

1.) 所以在我的菜单栏上,我有:

<%= link_to blog.title, blog, :remote=>true %>

在我的内容区,我有:

<div id="contenthere"></div>

2.) 所以据我了解,这应该会触发博客控制器的 show 方法。在那里,我在方法中有以下内容:

@blog = Blog.find(params[:id])

respond_to do |format|
   format.js { render :show_blog }
end

3.) 应该在views/blogs 文件夹中查找名为show_blog.js.erb 的文件:

$("#contenthere").html("<%=escape_javascript(render :partial=>"show_blog")%>");

这将使用我的 div 和 commenthere id 并呈现 _show_blog.html.erb 部分(位于博客视图文件夹中),其 blog 参数等于在我的博客控制器中设置的 @blog 参数。

4.) 所以我的节目博客部分有这个代码:

<%=@blog.title %>
<%=@blog.user_id %> 

编辑:实际上,我四处搜索,发现我不能使用资产文件夹中的“渲染”方法——那我应该把 js.erb 放在哪里?我已将其移至博客视图文件夹、主视图文件夹 (index.html.erb) 和仅 /view/ 文件夹...错误消失了,但链接不起作用...

编辑:将 show_blog.js.erb 放在我的视图/博客文件夹中,因为它是博客控制器调用它。当我单击链接并且控制台中没有显示 JS 错误时,什么也没有发生。 js是否被调用?

编辑:更改以反映我的最终答案。

【问题讨论】:

  • 你试过了吗:$("#contenthere").html("&lt;%= render('show_blog', :blog=&gt;@blog) %&gt;");去掉j(...)
  • 你应该使用escape_javascript(render..) 而不是j(render...) 知道错误是来自渲染部分还是来自控制器也很有价值。尝试render 'show_blog'(如果它位于与控制器同名的目录中)而不是使用符号
  • 其实我发现是因为assets文件夹不能调用render...我要把show_blog.js.erb文件移到哪个文件夹?
  • 它进入views/nameofcontroller,或者views/anything,但是在第二种情况下你必须使用render 'anything/show_blog'
  • 检查是否有任何JS错误。

标签: ruby-on-rails partial-views


【解决方案1】:
@blog = Blog.find(params[:id])

respond_to do |format|
   format.js { render :show_blog }
end

这不是 Rails 的默认逻辑。

你没有提供,方法是怎么调用的,假设

   def show_blog
    @blog = Blog.find(params[:id])
    respond_to do |format|
       format.js 
    end
    end

然后,Rails 将在 views/blogs 中查找 show_blog.js.erb 并渲染该文件。

另外,您需要将实际实例传递给部分,因为 patrial 是独立的代码块并且不知道 @blog 是什么:

$("#contenthere").append("<%=j render :partial=>"show_blog", :locals=>{:@blog=>@blog}%>");

【讨论】:

  • 嗯,嗯,其实最后,只写 render :show_blog 就可以了,因为它会寻找一个名为 show_blog 的 js 文件。我不需要定义一个名为 show_blog 的新方法。此外,partial 能够从博客控制器中的 @blog 中获取 @blog 的实例,该实例是从第一个链接中的 id 参数中获取的。编辑后问题中的最终解决方案应该可以正常工作并且体积较小。
  • @ays0110,方法只是为了显示 Rails 逻辑,我提供了名称来显示 Rails 将查看的文件和位置,实际上,您只是完全按照我的回答编辑了您的问题。 (更不用说,这个问题应该是问题,答案应该是答案,而且搞砸了会阻止整个步骤对其他用户有帮助)
【解决方案2】:

最后非常简单的解决方案--- 部分调用 blog.title、blog.user_id,但 @blog 是传递的实际参数。只需更改为@blog.title 和@blog.user_id。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多