0

我對Rails有個疑問。我在我的數據庫沒有主鍵與這些列 - person_id,年,工資表。我的問題是當我想編輯其中一個薪水時。我無法理解如何去做。這是我的代碼:沒有主鍵的Rails表

薪金控制器:

def index 
    @salaries = Salary.all 
end 

def edit 
    @salary = Salary.find_by_person_id_and_year(params[:person_id], params[:year]) 
    @people = Person.all 
end 

index.html.erb

<% @salaries.each do |salary| %> 
    <b><%= salary.person.Name %></b> 
    <b><%= salary.Year %></b> 
    <b><%= salary.Amount %></b> 
    <%= link_to "Edit", edit_salary_path(salary.person_id, salary.year)%> 
<% end %> 

所以,我想補充這我的routes.rb:

get 'salaries/index', :to => 'salaries#index',:as => 'salaries' 
get 'salaries/:person_id/:year', :to => 'salaries#show', :as => 'salary' 
get 'salaries/new/:person_id/:year', :to => 'salaries#edit', :as => 'new_salary' 
get 'salaries/edit/:person_id/:year', :to => 'salaries#edit', :as => 'edit_salary' 
put 'salaries/:person_id/:year', :to => 'salaries#update' 
post 'salaries/:person_id/:year', :to => 'salaries#create' 
delete 'salaries/:person_id/:year', :to => 'salaries#destroy' 

,但我在我的_form.html.erb中有這樣的錯誤信息:「undefined method`join'for nil:NilClass」on this line:<%= form_for(@s alary)do | f | %>

def edit 
    @person_id = params[:person_id] 
    @year = params[:year] 
    @salary = Salary.find_by_person_id_and_year(params[:person_id], params[:year]) 
    @people = People.all 
end 

def update 
    @people = People.all 
    @salary = Salary.new(params[:salary]) 
    if @salary.save 
     flash[:success] = "Successfully edited salary" 
     redirect_to salaries_path 
    else 
     @title = "Edit salary" 
     render 'edit' 
    end 
end 

_form.html.erb 

<%= form_for(@salary, :url => salaries_path(:person_id => @person_id, :year => @year)) do |f| %> 

回答

2

導軌路由意願使用正常訪問自動尋找id,所以你需要自定義你的路線。

例如,而不是在配置resources :salaries/routes.rb中嘗試類似:

get 'salaries/index', :to => 'salaries#index',:as => 'salaries' 
get 'salaries/edit/:person_id/:year', :to => 'salaries#edit', :as => 'edit_salaries' 
put 'salaries/:person_id/:year', :to => 'salaries#update' 

與其他路線,因爲你需要,如:

get 'salaries/index', :to => 'salaries#index',:as => 'salaries' 
get 'salaries/:person_id/:year', :to => 'salaries#show', :as => 'salary' 
get 'salaries/new/:person_id/:year', :to => 'salaries#edit', :as => 'new_salary' 
get 'salaries/edit/:person_id/:year', :to => 'salaries#edit', :as => 'edit_salary' 
put 'salaries/:person_id/:year', :to => 'salaries#update' 
post 'salaries/:person_id/:year', :to => 'salaries#create' 
delete 'salaries/:person_id/:year', :to => 'salaries#destroy' 

而且形式:

form_for(@salary, :url => salary_path(:person_id => X, :year => Y)) do |f| 
+0

謝謝,它的工作原理,但奇怪的是,現在我的_form.html.erb中有這個錯誤消息:「未定義的方法'連接爲零:NilClass」在這一行:<%= form_for(@salary)do | f | %> – user1107922

+1

您需要稍微更改form_for以應對與約定的區別:form_for(@salary,:url => salaries_path(:person_id => X,:year => Y))do | f |根據需要使用您的參數 –

+0

好的,但爲什麼現在不能在調用更新或創建時保存到數據庫。我的網址是http://0.0.0.0:3000/salaries/index?year=2013,並沒有更新我的分區 – user1107922

0

如果可以附加ID列添加到工資表時,可以使用標準導軌的功能,如

(in app/models/person.rb) 

class Person 
    has_many :salaries 
    has_one :current_salary, :class_name => "Salary", 
      :conditions => lambda { {:year => Time.now.year} } 
    # outer curlies are for the lambda, inner curlies are for it to return a hash 
end 

(in config/routes.rb) 


resources :people do 
    resources :salaries 
end 

然後,通過ID

+0

是的,我可以通過添加主鍵在我的表中,但我不想。如果沒有這個新的專欄,可以做到嗎? – user1107922