0

Railsについて質問があります。データベースに、person_id、year、salaryの列を持つ主キーのないテーブルがあります。私の問題は、給与の1つを編集したいときです。どうしたらいいのかわからない。それが私のコードです:

給与管理者:

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に次のエラーメッセージがあります:この行の「undefinedmethod `join'for nil:NilClass」:<%= form_for(@salary)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|   %>
4

2 に答える 2

2

Railsルーティングは自動的にIDを検索するため、ルートをカスタマイズする必要があります。

たとえばresources :salaries、config / routers.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|
于 2012-09-30T09:09:02.493 に答える
0

給与テーブルにID列を追加できる場合は、次のような標準のrails関数を使用できます。

(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による通常のアクセスを使用します

于 2012-09-30T08:44:49.043 に答える