2014-10-03 65 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纖細且可讀)。