当你有布局时,如何获得@post的params [:id]:false

时间:2017-06-16 16:35:24

标签: ruby-on-rails

我是Rails的新手,想要创建一个模型,其中每个post#show都会进入一个bootstrap-modal而不是单独的show.html.erb页面。

在我的show方法中,我有类似的内容:

def show 
  @confessions = Confession.find(params[:id])
  @comment = Confessioncomment.where(confession_id: @confessions).paginate(page: params[:page], per_page: 5).order('created_at ASC')
end

我现在从@confessions获取params[:id]以显示我点击的确切帖子,但我想要的不是显示单独的显示页面而是加载我的引导程序中的所有内容-modal在同一页面上。

我知道我可以使用layout :false告诉该节目没有布局,但我不知道如何使用它,或者是否有其他方法可以使用它。

如何在同一页面上显示帖子,而不是从控制器加载新页面。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

不要通过rails视图渲染器加载它。相反,从JavaScript代码中执行AJAX调用,然后在加载引导模式之前命中端点/路由以获取记录,但将其作为json返回:

def show 
  @confessions = Confession.find(params[:id])
  @comment = Confessioncomment.where(confession_id: @confessions).paginate(page: params[:page], per_page: 5).order('created_at ASC')

  render json: @confessions, status: 200
end

然后在JS上使用json响应来动态加载模态。

您可能还希望仅返回一个供认实例模型,并从其关系中提取评论:@confession.comments但您需要正确设置模型。这将使您的渲染比使用两个不同的实例变量更容易。

答案 1 :(得分:1)

在供词清单/表中

<%= link_to @confession.title, @confession, remote: true %>
控制器中的

def show 
  @confessions = Confession.find(params[:id])
  @comment = Confessioncomment.where(confession_id: @confessions).paginate(page: params[:page], per_page: 5).order('created_at ASC')

  respond_to do |format|
    format.html
    format.js
  end
end

使用以下内容创建文件show.js.erb

$('#dynamically_filled').find('.modal-dialog:first').html("<%=j render('confession') %>");
$('#dynamically_filled').modal();

将其添加到show.html.erb

的顶部
<div class="modal fade" tabindex="-1" role="dialog">
  <div class="modal-dialog" role="document">

  </div><!-- /.modal-dialog -->
</div><!-- /.modal -->

_confession.html.erb的内容必须与其余内容相关联

<div class="modal-content">
  <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
    <h4 class="modal-title"><%= @confession.title %></h4>
  </div>
  <div class="modal-body">
    <p><%= @confession.content %></p>
  </div>
</div><!-- /.modal-content -->

答案 2 :(得分:0)

首先,布局错误不是你想的......

Rails适用于某些默认行为。即使控制器中没有方法定义,应用程序的每个路径都将调用具有相同名称的视图。

如果您不想使用任何方法渲染另一个模板,则必须在其末尾调用渲染函数。

def show 
  @confessions = Confession.find(params[:id])
  @comment = Confessioncomment.where(confession_id: @confessions).paginate(page: params[:page], per_page: 5).order('created_at ASC')
  render 'another/page', layout: false
end

我告诉使用该代码的是使用布局错误从该路径“另一个/页面”渲染模板。

现在我告诉你什么是布局错误。

您的全新项目附带了application.htlm.erb布局,可以生成应用的每个其他页面。有时您不希望页面由该布局产生,因此您应用布局false或布局:'another / layout'。