2017-04-10 60 views
0

我在編輯best_in_place gem模型的名稱字段以直接編輯項目。當試圖這樣做時,我得到一個錯誤422不可處理的實體。Rails best_in_place無法處理的實體

我已經做了一些研究,並在響應中發現,控制器不僅期望name屬性,還包括組和其他一些屬性。

["Group must exist","Lumo can't be blank","Lumo is not a number"] 

我以正確的方式設置我的控制器(我認爲)。

materials_controller.rb 

def update 
    @material = Material.find(params[:id]) 

    if params[:commit] == "Save" then 

    success = @material.update(material_params) 
    params[:create_pure_composition] = false 
    else 
    @material = Material.new(material_params) 
    @material.user_id = current_user.id 
    success = @material.save 
    end 

    respond_to do |format| 
    if success 
     plot1 = prepare_e_plot(@material) 
     plot2 = prepare_st_plot(@material) 
     format.html { redirect_to @material } 
     format.json { render json: { plot1: plot1, plot2: plot2, status: 200 } } 
    else 
     format.html { render 'edit' } 
     format.json { respond_with_bip(@material) } 
    end 
    end 
end 

有沒有一種方式與best_in_place更新名稱屬性時發送這些值?我嘗試了best_in_place的params屬性。

<%= best_in_place @material, :name, as: :input, params: { group_id: @material.group_id } %> 

這並沒有發送任何額外的參數與更新。

以下是Material模型的內容。

material.rb 

class Material < ActiveRecord::Base 

    belongs_to :user 
    belongs_to :group 

    validates :name, presence: true, uniqueness: {scope: :user_id} 
    validates :lumo, presence: true, numericality: true 

end 

有沒有人知道它爲什麼要求其他屬性,爲什麼best_in_place不會發送這些信息?

回答

0

我想出了問題所在,以及如何解決問題。編輯材料時,我們使用選項「保存」或「另存爲」。因此我們在控制器中檢查params[:commit]

通過編輯網址,我可以發送params[:commit],並使用best_in_place進行更新。這裏是best_in_place代碼如何結束如下:

<%= best_in_place @material, :name, as: :input, url: material_path(@material, commit: "Save") %>