【问题标题】:Rails table without primary key没有主键的 Rails 表
【发布时间】:2012-09-30 08:31:01
【问题描述】:

我有一个关于 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 中有这些错误消息:“undefined method `join' for nil:NilClass” on this line:

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|   %>

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-3.2


    【解决方案1】:

    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|
    

    【讨论】:

    • 谢谢,它可以工作,但奇怪的是,现在我的 _form.html.erb 中有这个错误消息:"undefined method `join' for nil:NilClass" 在这一行:
    • 您需要稍微更改 form_for 以应对与惯例的差异: |f|根据需要使用您的参数
    • 好的,但是当调用更新或创建时,为什么现在无法保存到数据库。我的网址是0.0.0.0:3000/salaries/index?year=2013,我的数据库中没有更新
    • 我做到了,但还是不行。用我所有的代码编辑了我的帖子。
    • 在 :url=> 中使用薪水路径而不是薪水路径会发生什么?
    【解决方案2】:

    如果您可以在薪金表中添加额外的 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使用普通访问

    【讨论】:

    • 是的,我可以通过在我的表中添加主键来做到这一点,但我不想要。没有这个新专栏可以做到吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 2023-03-11
    • 2019-05-23
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多