2015-05-08 28 views
0

問題的條目:編輯與兩個不同的列

當我編輯嵌套模型的內容,這樣可以節省而不是編輯的那些已經有新的條目。

的車型:

# job.rb 
class Job < ActiveRecord::Base 
    # Relations 
    has_many :logs, :dependent => :destroy 

    accepts_nested_attributes_for :logs, allow_destroy: true, reject_if: proc { |a| a['user_id'].blank? } 
end 


# log.rb 
class Log < ActiveRecord::Base 
    belongs_to :job 
    belongs_to :user 

    # a single user should not be logged more than once per job 
    validates :user_id, uniqueness: { scope: :job_id } 
end 


# user.rb 
class User < ActiveRecord::Base 
    has_many :logs 

    validates_presence_of :name 

    def self.all_active 
     User.where(active: 1) 
    end 

end 

作業控制器:

class JobsController < ApplicationController 
before_action :set_job, only: [:show, :edit, :update, :destroy] 

def index 
    @jobs = Job.all 
end 

def show 
end 

def new 
    @job = Job.new 
    10.times { @job.logs.build } 
end 

def edit 
    (@job.people - @job.logs.count).times { @job.logs.build } 
end 

def create 
    @job = Job.new(job_params) 

    # Set the admin id 
    @job.logs.each do |log| 
    log.admin_id = current_admin.id 
    end 

    respond_to do |format| 
    if @job.save 
     format.html { redirect_to @job, notice: 'Job was successfully created.' } 
     format.json { render :show, status: :created, location: @job } 
    else 
     format.html { render :new } 
     format.json { render json: @job.errors, status: :unprocessable_entity } 
    end 
    end 
end 

def update 
    respond_to do |format| 
    if @job.update(job_params) 
     format.html { redirect_to @job, notice: 'Job was successfully updated.' } 
     format.json { render :show, status: :ok, location: @job } 
    else 
     format.html { render :edit } 
     format.json { render json: @job.errors, status: :unprocessable_entity } 
    end 
    end 
end 

def destroy 
    @job.destroy 
    respond_to do |format| 
    format.html { redirect_to jobs_url, notice: 'Job was successfully destroyed.' } 
    format.json { head :no_content } 
    end 
end 

private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_job 
    @job = Job.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def job_params 
    params.require(:job).permit(:people, :logs_attributes => [:user_id]) 
    end 
end 

工作表單

<%= form_for(@job) do |f| %> 
<% if @job.errors.any? %> 
    <div id="error_explanation"> 
    <h2><%= pluralize(@job.errors.count, "error") %> prohibited this job from being saved:</h2> 

    <ul> 
    <% @job.errors.full_messages.each do |message| %> 
     <li><%= message %></li> 
    <% end %> 
    </ul> 
    </div> 
<% end %> 

<div class="row"> 
    <div class="small-3 columns"><%= f.label :people %></div> 
    <div class="small-9 columns"><%= f.integer :people %></div> 
</div> 

<table> 
    <%= f.fields_for :logs do |builder| %> 
    <%= render 'logs/form', { f: builder } %> 
    <% end %> 
</table> 

<div class="actions"> 
    <%= f.submit %> 
</div> 

部分的日誌:

<tr> 
    <td> 
    <%= f.label :user_id %><br> 
    <%= f.collection_select(:user_id, User.all_active, :id, :name, { :prompt => 'Select User' }) %> 
    </td> 
    <td> 
    <%= f.label :performance %><br> 
    <%= f.number_field :performance %> 
    </td> 
</tr> 

創建工作能正常工作。然後我去編輯條目。在作業編輯屏幕上,我看到所有日誌以及剩餘的空白日誌輸入行(由於作業控制器中的10.times @logs.build)。

現在,無需編輯任何內容,我點擊提交。我得到以下錯誤:

1 error prohibited this war from being saved: 
    Logs user has already been taken 

此外,顯示原來的項,然後在它們下面是重複完全相同的條目,但是「紅」,由於錯誤。空白條目列表(從10.times)不再顯示。

但是,如果將編輯屏幕中的所有日誌用戶更改爲其他內容,我將不會收到錯誤消息。它將改爲使用這些新選擇的用戶創建新條目,而不是修改當前條目。

我希望我已經提供了足夠的信息來解決這個問題!謝謝

回答

0

所以,事實證明,問題是由於沒有白名單日誌的:id參數造成的。

我改變了我的job_controller中:

來源:

def job_params 
    params.require(:job).permit(:people, :logs_attributes => [:user_id]) 
end 

要:

def job_params 
    params.require(:job).permit(:people, :logs_attributes => [:id, :user_id]) 
end 

那是什麼用的驗證造成的問題!這可能過於複雜,以幫助任何人,但嘿,它可能會!

相關問題