我创建了一个具有project
模型的应用程序。模型中存储了一些信息,用户可以向project
添加注释(使用comment
模型)。在项目的show视图中,我希望用户能够在“info”部分(包含项目信息和“注释”部分(包含项目中写的注释))之间切换。我想使用AJAX。所以我将有两个按钮:Information& Comments。
现在我知道如何基于“远程链接”呈现部分,但我还必须找出点击了哪个链接。到目前为止,我可以在点击一个链接时渲染一个部分:
// In show.html.haml
= link_to("Information", :project, :id => "link_one", :remote => true)
= link_to("Comments", :project, :id => "link_two", :remote => true)
#partial_window
// In show.js.haml
$("#partial_window").html("#{j(render("comments"))}")
现在,当我点击其中一个链接时,这会呈现_comment.html.haml
部分。我需要知道的是如何检查点击了哪个链接,然后呈现相应的部分:_info.html.haml
或_comments.html.haml
。
提前感谢您的帮助!
答案 0 :(得分:23)
像这样的东西应该工作。我们将使用嵌套路由。查看ryan's screencast(有点旧,但它得到了重点)或更多updated version about nested forms(使用相同的原则)。您将需要支付更新版本,但我发现我的RailsCast订阅价值超过9美元/月。此外,以下是docs示例。
config/routes.rb
resources :projects do
resources :comments
end
comments_controller.rb
class CommentsController < ApplicationController
def index
project = Project.find params[:project_id]
@comments = project.comments
respond_to do |format|
format.html #responds with default html file
format.js #this will be the javascript file we respond with
end
end
end
views/comments/index.js.erb
$('#holderDiv').empty().append('<ul> <%= j render @comments %> </li>')
这使用一个漂亮的rails来寻找comment
部分,并为@comments
中的每个评论呈现它。 j helper转义javascript,几乎将渲染的部分插入append
函数。
views/comments/_comment.html.erb
<li> <%= @comment.description %> </li>
所以我们现在已经清除了#holdingDiv
并插入了我们的评论。对于information
,可能是这样的:
projects_controller.rb
class ProjectsController < ApplicationController
def index
@project = Project.find params[:id]
respond_to do |format|
format.html
format.js
end
end
end
views/project/index.js.erb
$('#holderDiv').empty().append('<%= j render 'information', information: @project.information %>')
views/project/_information.html.erb
<h2>
<%= information.title %>
</h2>
<p>
<%= infomration.details %>
</p>
然后,您的远程链接将类似于:
= link_to("Information", @project, :remote => true)
= link_to("Comments", project_comments_url(@project), :remote => true)
我不得不对你的数据结构做出一些假设。让我知道我困惑你的地方。
另外,我确信我有一些错别字,对不起。我没有对此进行测试,只是脱离了我的头顶。