2016-01-23 117 views
-1

我是一名Ruby on Rails的新手,這也是我的第一個Ruby應用程序。問題是數據庫關係我試圖使關係在兩個表中,並且相同的過程在另一個關係中正常工作,但在這裏顯示錯誤。Rails數據庫表關係問題

的錯誤是:

未定義的方法`create_applied_jobs'的零:NilClass

這裏是我的代碼:

applied_job.rb

class AppliedJob < ActiveRecord::Base 
    belongs_to :jobseekers 
end 

jobseeker.rb

class Jobseeker < ActiveRecord::Base 
    has_one :applied_job 
end 

view_details_controller.rb

def create 
    params.permit! 
    if @applied_job = @current_user.create_applied_jobs(params[:applied_job]) 
    flash[:notice] = "You have applied successfully" 
    render "viewDetails" 
    else 
    render "viewDetails" 
    flash[:warning] = "Please try agian" 
    end 
end 

sessions_helper.rb

def current_user 
    @current_user ||= Jobseeker.find_by(jobseeker_id: session[:user_id]) 
end 

viewDetails.html.erb

<%= form_for :applied_job, url: viewDetails_path(@applied_job), action: :create, method: :post do |f| %> 
    <ul class="form-style-1"> 
     <li><label>Preferred Joining Date<span class="required">*</span></label> 
      <%= f.text_field :preffered_joining_date, class: 'field-long', id: 'datepicker', placeholder: 'Preferred Joining Date'%> 
     </li> 
     <li> 
      <label>Expected Salary <span class="required">*</span></label> 
      <%= f.text_field :expected_salary, class: 'form-control', placeholder: 'Expected Salary'%> 
     </li> 
     <li> 
      <input type="submit" value="Submit" /> 
     </li> 
    </ul> 
<% end %> 

我想將數據插入到applied_jobs表中,其中jobseeker_id是foreign_key。

任何人都可以幫助我確定哪裏有bug?

+0

Mukto蒙娜麗莎,什麼是CURRENT_USER,是用戶表,發佈user.rb代碼以及 –

+0

好的@RameshKumarThiyagarajan – Fameless

+0

你在'jobseekers'表中有'jobseeker_id'嗎? – Pavan

回答

1
#app/controllers/view_details_controller.rb 
class ViewDetailsController < ApplicationController 

    def create 
     @applied_job = current_user.applied_jobs.new applied_params 
     if @applied_job.save 
     flash[:notice] = "You have applied successfully" 
     else 
     flash[:warning] = "Please try agian" 
     end 
     render "viewDetails" 
    end 

    private 

    def applied_params 
     params.require(:applied_job).permit(:params, :for, :job) 
    end 
end 

當調用一個方法時,您必須確保引用了方法名稱本身(在您的案例中爲current_user)。雖然它設置了instance variable,但調用應該轉到方法本身(因爲它會返回由var設置的值)。


既然你是一個初學者,這裏有根據您的代碼一些指針:

-

閱讀上MVC (Model View Controller) - 控制器應該是模型的管道。 Rails控制器的命名約定是反映您試圖操縱/編輯的resource

打電話給你的控制器view_details_controller,但你正在改變applied_jobs違背了convention。雖然不是問題,但當您開始處理大規模應用程序時,會引發問題。

要清理它,做這樣的事情:

#config/routes.rb 
resources :jobs do # -> url.com/jobs/:id 
    resources :applications, path: "apply" only: [:create, :destroy] #-> url.com/jobs/:job_id/apply 
end 

#app/controllers/applications_controller.rb 
class ApplicationsController < ApplicationController 
    before_action :current_user 

    def create 
     @job   = Job.find params[:job_id] 
     @applied_job = current_user.applied_jobs << @job 
    end 

    private 

    def current_user 
     @current_user ||= JobSeeker.find_by jobseeker_id: session[:user_id] 
    end 
end 

-

使用連接表 - 你目前正在製作新的AppliedJob每次發送請求到控制器的時間記錄。雖然這不是我的問題,但您如何設計您的應用程序,重要的是,您正在使其效率更高(DRY)。

你會更有效使用has_many :through協會:

#app/models/job_seeker.rb 
class JobSeeker < ActiveRecord::Base 
    has_many :applications 
    has_many :applied_jobs, through: :applications, class_name: "Job", source: :job 
end 

#app/models/application.rb 
class Application < ActiveRecord::Base 
    belongs_to :job_seeker 
    belongs_to :job 
end 

#app/models/job.rb 
class Job < ActiveRecord::Base 
    has_many :applications 
    has_many :applicants, through: :applications, class_name: "JobSeeker", source: :job_seeker 
end 

以上將允許您使用以下命令:

#config/routes.rb 
resources :jobs do 
    resources :applications, only: [:create, :destroy] #-> url.com/jobs/:job_id/applications 
end 

#app/controllers/applications_controller.rb 
class ApplicationsController < ApplicationController 
    def create 
     @job   = Job.find params[:job_id] 
     @application = current_user.applied_jobs << @job #-> automatically creates "application" join record 
    end 

    def destroy 
     @job   = Job.find params[:job_id] 
     @application = current_user.applied_jobs.delete @job 
    end 
end 
+0

我的榮幸,希望它對你有好處 –

+0

現在關係還行,但是數據並沒有插入其他列@Rich Peck – Fameless

+0

你能具體嗎?哪些列和哪些數據?你把你的參數放到'applied_pa​​rams'中,或者只是使用佔位符代碼? –

0

你的求職者有

HAS_ONE:applied_job

將(結尾沒有S)添加create_applied_job方法對求職者模式,而不是create_applied_jobs

至於爲什麼你CURRENT_USER被返回null ,通常求職者表會有一個id列,而不是一個jobseeker_id列,所以我會假設它應該是

def current_user 
    @current_user ||= Jobseeker.find(session[:user_id]) 
end 
+1

這不是當前的問題。問題是'@ current_user'是零。 – Pavan

+0

謝謝@湯姆很好的答案,但它不能正常工作。 – Fameless