2017-08-08 40 views
0

我試圖通過使用到歸檔Product在Rails的5Rails的5 - 無法更新的link_to單個屬性,未定義的方法`to_sym」

視圖中的link_to

<% @products.each do |product| %> 
    <%= link_to product_path(product, "product[archived]" => true), 
      :method => :put, 
      data: { confirm: 'Sure?' } do %> 
    <i class="fa fa-archive color-danger" aria-hidden="true"></i> 
    <% end %> 
<% end %>  

但是點擊鏈接後,我的ProductsController引發以下錯誤:

undefined method `to_sym' for {:archived=>false}:Hash Did you mean? to_s to_yaml to_set 

錯誤指向if @product.update(product_params)線。全面更新的方法是:

def update 
    @product = Product.find(params[:id]) 
    puts @product.id 

    if @product.update(product_params) 
    redirect_to @product 
    else 
    render 'edit' 
    end 
end 

編輯

其實問題的行是我Product模型寫的不好的驗證。

我有:validates_uniqueness_of :code, :scope => [:archived => false],它應該是validates_uniqueness_of :code, conditions: -> { where.not(archived: true) }

事後看來,這是一個愚蠢的錯誤,但現在我想知道爲什麼它被扔這樣一個奇怪的錯誤和糟糕的是,錯誤是在控制器 ...

+0

你的路線上有什麼? –

+0

@SebastiánPalma'資源:產品做 資源:product_prices 結束' – bplmp

回答

0

在驗證的scope屬性期待一個單一的屬性或屬性從你的模型數組,像

class Product < ApplicationRecord 
    validates_uniqueness_of :code, :scope => :archived 
end 

事實證明,包括:scope選項adds a where clause during the validation它看起來像where(:archived => false)根據我上面的例子。

從您的原始代碼validates_uniquesness_of :code, :scope => { :archived => false },這導致範圍執行where({:archived => false} => nil)。你可以看到where的散列參數肯定是關閉的。

在堆棧後來,ActiveRecord是要試圖把從參數哈希鍵成一個符號以to_sym並查找鍵的Product模型的屬性。但是,這種情況下的密鑰是散列{:archived=>false},它不響應to_sym,並且此處引發未定義的方法錯誤。

錯誤「出現」在控制器中的原因是因爲控制器中的線路product.update(product_params)是導致在模型中調用錯誤驗證的調用鏈的開始,您確定該錯誤是源的錯誤。

+0

謝謝!很好的答案。我拒絕了對我的問題的建議編輯,並返回到原始的'validates_uniqueness_of:code,:scope => [:archived => false]'。我知道這是不好的語法,但我想強調這是造成原始錯誤和奇怪行爲的原因。 – bplmp

相關問題