2014-10-03 71 views
-1

我正在撰写简历申请表,列出我的工作经历,教育历史和其他责任。这是我自己的第一个没有教程的rails应用程序,但我所做的大部分工作就是遵循相同的操作。所有的代码在这里:https://github.com/victorman/portfolio干燥代码导致产量翻番

快速概要。我对我的应用程序进行了ajax处理,并使其工作。但是我有一个具有完全相同html的模板作为视图的一部分,所以我用render :partial...替换了该部分。结果是之前两倍的html。以下是我对应用做了更详细的描述。


我做了两个脚手架,一个用于乔布斯和一个用于分类。乔布斯有一个外键来分类。

我做了工作查看列表每个类别的链接。然后jobs#index控制器仅查找该类别的作业表中的行。

然后我决定抛出一些Ajax在那里,以便点击链接只会重新加载相关数据。我在jobs#index方法的末尾添加了respond_to。

def index 
    #find which jobs to display based on category_id in the url params 
    #if no category_id param is given default to 1 
    unless params.has_key? :category_id 
    @jobs = Job.find(:all, :conditions => {:category_id => 1}) 
    else 
    @jobs = Job.find(:all, :conditions => {:category_id => params[:category_id]}) 
    end 

    respond_to do |format| 
    format.html 
    format.js #index.js.erb 
    end 
end 

我做了一个index.js.erb文件,它检索新数据并替换旧数据。

var jobs = $("<%= escape_javascript(render(:partial => @jobs))%>").hide(); 
$("#jobs_table").replaceWith(jobs); 
$("#jobs_table").fadeIn(); 

我添加了远程:对作业index.html.erb文件中的链接为true。

<ul> 
    <% Category.all.each do |category| %> 
    <li><%= link_to category.name, { :controller => "jobs", :category_id => "#{category.id}" }, :class => "category_link", remote: true %></li> 
    <% end %> 
</ul> 

而且我将模板部分作为显示作业的地方。它会永远找不到_jobs.html.erb,所以我不得不毕竟它的工作将其命名为_job.html.erb

<tbody id="jobs_table"> 
    <% @jobs.each do |job| %> 
    <tr> 
     <td><%= job.organization %></td> 
     <td><%= job.location %></td> 
     <td><%= job.details %></td> 
     <td><%= job.start_date %></td> 
     <td><%= job.end_date %></td> 
     <td><%= link_to 'Show', job %></td> 
     <td><%= link_to 'Edit', edit_job_path(job) %></td> 
     <td><%= link_to 'Destroy', job, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
    </tr> 
    <% end %> 
</tbody> 

,但我还没有DRY'd了代码,所以我删除重复的部分从index.html.erb这是在_job.html.erb(如上所示)并用它替换它。

<%= render :partial => @jobs %> 

,现在它给了我两个相同的<tbody>标签使用id = “jobs_table”。为什么这会提供重复的数据?

two tbody tags. guess where I live.

+0

我的回答有什么帮助吗? – 2014-10-07 12:53:40

+0

他们似乎没有修复这个bug。 https://github.com/victorman/portfolio/commit/2a47305d3f82000c9c75f8b8effc32fd67ee74f0 – Victor 2014-10-13 15:08:50

回答

0

问题是由于不理解rails何时操纵单数复数。

调用会自动跳转到@jobs中每个元素的局部_job.html.erb。但是由于@jobs.each do |job|,部分元素再次遍历每个元素。

要修复它,请在渲染线中将@jobs替换为"jobs",并将_job.html.erb重命名为_jobs.html.erb。 或者,只需用@jobs替换为"job"并保留模板名称_job即可保存一个步骤,但这会强化不正确的命名方案。

index.html.erb:

<tbody id="jobs"><%= render partial: "jobs" %></tbody> 

index.js.erb的:

$("#jobs").html("<%= escape_javascript(render(partial: 'jobs'))%>") 

现在,它只是从字面上搜索_jobs模板(_jobs.html.erb),并使其一次,而不是单独使用该名称并渲染多次。

1

你已经得到了很多解决...
在你的routes.rb创建一个嵌套的路线:

resources :jobs 
resources :categories do 
    resources :jobs 
end 

index.html.erb:

<h1>Listing jobs</h1> 
<div> 
    <ul> 
    <% Category.all.each do |category| %> 
     <li><%= link_to category.name, category_jobs_path(category), 
       class: "category_link", remote: true %></li> 
    <% end %> 
    </ul> 
</div> 
<table> 
    <thead> 
    <tr> 
     <th>Organization</th> 
     <th>Location</th> 
     <th>Details</th> 
     <th>Start date</th> 
     <th>End date</th> 
     <th></th> 
     <th></th> 
     <th></th> 
    </tr> 
    </thead> 
    <tbody id="jobs_table"><%= render partial: @jobs %></tbody> 
</table> 
<br/> 
<%= link_to 'New Job', new_job_path %> 

jobs_controller.rb的索引可以(应该)重构为:

class JobsController < ApplicationController 
    def index 
    @jobs = Job.where(category_id: params[:category_id] || 1) 
    respond_to do |format| 
     format.html 
     format.js 
    end 
    end 
end 

和index.js。该局响应也应该重构为:

$("#jobs_table").html("<%= escape_javascript(render partial: @jobs) %>") 
$("#jobs_table").fadeIn() 

有这应该是较多的孕像一些命名问题:

工作,而不是jobs_table

代替category_link
同样试图找到属于类别1的作业很奇怪。处理与ID为1的默认类别不同的​​响应(硬编码ID是您可以做的最糟糕的事情之一)。
“分类”列表中的div是无用的(保持呈现的HTML纤细且可读)。