2012-08-31 38 views
6

Tôi hiện có biểu mẫu xây dựng một phương tiện. Mô hình xe ban đầu trông giống như:Bỏ qua các trường khi gửi biểu mẫu

class Vehicle < ActiveRecord::Base 
    attr_accessible :trim_id 

    belongs_to :trim 
end 

Bạn sẽ lưu ý rằng không có make_id hay model_id cột; đây không phải là yêu cầu, vì một trang trí thuộc về một mô hình, và một mô hình thuộc về một mô hình, do đó, họ không cần phải được lưu trữ trong mô hình xe.

Sự cố phát sinh trên mẫu xe - Tôi có một số lựa chọn được liên kết, nơi tôi có thể chọn chế độ tạo, sau đó là kiểu máy, sau đó cắt. Khi tôi đang tạo ra một chiếc xe mới, đoạn mã sau hoạt động tốt:

<%= select("", "", Make.all.collect {|p| [ p.value, p.id ] }, {:prompt => 'Select Make'}, {} %> 
<%= f.select("", "", options_for_select([]), {:prompt => 'Select Model'}, {} %> 
<%= f.select(:trim_id, options_for_select([]), {:prompt => 'Select Trim'} %> 

Như bạn sẽ lưu ý, thực hiện và mô hình Selects không có tham số hình thức, và do đó sẽ được bỏ qua. Điều này làm việc tốt, và chiếc xe được lưu một cách chính xác.

Khó khăn phát sinh khi tôi muốn chỉnh sửa chiếc xe này; bởi vì thực hiện và mô hình chỉ đơn giản là giả chọn để chuỗi để cắt, họ ban đầu được thiết lập để giá trị mặc định, không phải là thực hiện và mô hình của chiếc xe đang được chỉnh sửa. Kết quả là tôi đã cập nhật mô hình của tôi trông giống như:

class Vehicle < ActiveRecord::Base 
    attr_accessible :trim_id 

    belongs_to :trim 
    has_one :model, :through => :trim 
    has_one :make, :through => :model 
end 

Và cập nhật các hình thức:

<%= f.select(:make, Make.all.collect {|p| [ p.value, p.id ] }, {:prompt => 'Select Make'}, {} %> 
<%= f.select(:model, options_for_select([]), {:prompt => 'Select Model'}, {} %> 
<%= f.select(:trim_id, options_for_select([]), {:prompt => 'Select Trim'} %> 

Nhưng, như sẽ được dự kiến, kết quả này trong Can't mass-assign protected attributes: make, model, kể từ khi thực hiện và mô hình không attr_accessible (và trong mọi trường hợp, cột tạo và mô hình không tồn tại).

Câu hỏi của tôi là: có cách nào bỏ qua các trường này khi gửi biểu mẫu xe mới, nhưng vẫn yêu cầu họ chọn đúng giá trị khi xe đang được chỉnh sửa?

Cảm ơn!

EDIT: mỗi câu trả lời từ Beerlington, tôi đã cập nhật hành động create của tôi như sau:

def create 
    @sale = Sale.new 
    current_ability.attributes_for(:new, Sale).each do |key, value| 
     @sale.send("#{key}=", value) 
    end 
    @sale.update_attributes(params[:sale].except("date")) 
    authorize! :create, @sale 
    if @sale.save 
     redirect_to @sale, :notice => "Successfully created sale." 
    else 
     render :action => 'new' 
    end 
end 

Bạn sẽ lưu ý rằng tôi đang cố gắng để trừ "ngày" ở đây (cũng đã thử: date) - đây là thử nghiệm với thuộc tính không lồng nhau.

Tôi đang tìm, tuy nhiên, ngày đó vẫn đang được gửi - bất kỳ ai có thể hỗ trợ toàn bộ hành động điều khiển bằng cách sử dụng Hash # ngoại trừ không?

EDIT 2: Tôi đã đánh dấu câu trả lời Beerlington như đúng, vì nó đã trả lời câu hỏi ban đầu - Tôi đã hỏi một câu hỏi theo dõi ở đây: Excluding nested form fields in controller action with Hash#exclude before mass_assignment error is generated?

Trả lời

12

Bạn có thể loại bỏ các phím mà không cần thiết bằng cách sử dụng Hash#except :

@vehicle.update_attributes(params[:vehicle].except(:make, :model)) 
+0

Cảm ơn, có vẻ như nó sẽ hoạt động - bạn có thể cập nhật cách ngoại trừ thuộc tính lồng nhau, ví dụ: thực hiện trong vehicles_attributes"=>{"0"=>{"make"=>""}? Cảm ơn! –

+0

Được đánh dấu là câu trả lời vì câu trả lời cho câu hỏi gốc và đặt tôi đi đúng hướng. –

Các vấn đề liên quan