我对Rails有疑问。我的数据库中有一个没有主键的表,包含这些列 - person_id,year,salary。我的问题是当我想编辑其中一个薪水时。我无法理解如何做到这一点。那是我的代码:
工资控制员:
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中有这些错误消息:“此行上的nil:NilClass的未定义方法`join':&lt;%= form_for(@salary)do | f | %GT;
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| %>
答案 0 :(得分:2)
Rails路由会自动查找ID,因此您需要自定义路由。
例如,在config / routes.rb中代替resources :salaries
尝试类似:
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|
答案 1 :(得分: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
进行普通访问