2015-08-11 16 views
7

Tôi đang gửi biểu mẫu với 2-4 đối tượng cùng một lúc, tùy thuộc vào số lượng phụ huynh có. Tôi nhận ra rằng điều này có lẽ là độc đáo, nhưng tôi thực sự muốn người dùng có thể chỉnh sửa tất cả các đối tượng cùng một lúc trên một biểu mẫu. Vào mẫu của tôi, tôi đang làm:Rails 4 Params mạnh với nhiều đối tượng và phím số nguyên

<%= simple_fields_for "derps[]", derp do |f| %> 

<% end %> 

Sau đó, tôi đang làm điều này trong bộ điều khiển:

def update 
    @derps = [] 
    @rejects = [] 
    derps_params.each do |key, hash| 
    derp = Derp.find(key) 
    derp.assign_attributes(hash) 
    @rejects << derp unless derp.save 
    end 
    if @rejects.empty? 
    redirect_to @parent, flash: {success: 'Derps were successfully updated.'} 
    else 
    @derps = @rejects 
    render :edit 
    end 
end 

phép nói rằng có hai đối tượng - params đang đến qua như:

"derps"=>{"1"=>{"attribute"=>"39", "another_attribute"=>"serp", "a_third_attribute"=>"yerp"}, "2"=>{"attribute"=>"30", "another_attribute"=>"49", }} 

Tôi đã làm việc này trong Rails 3 mà không có thông số mạnh. Tôi đang nâng cấp lên đường ray 4 và tôi đang phải vật lộn với làm thế nào để làm việc này - tôi tiếp tục nhận được "thông số Unpermitted: 1, 2"

tôi giả sử tôi cần phải làm một cái gì đó như:

def mashes_params 
    params.require(:derps).permit(
    id: [] 

hoặc

def mashes_params 
    params.require(:derps).permit(
    :id, 

cái gì đó dọc những dòng này, nhưng tôi đã cố gắng nó mỗi cách tôi có thể nghĩ đến mà không may mắn.

Mọi ý tưởng ở đây?

+0

gì là 'mashes' trong mashes_params? Nếu đó là 'derps'? –

+0

Vâng, cảm ơn! Sửa lỗi đó. Đó là mã thực sự của tôi.Tôi đã sử dụng derps như một ví dụ chung chung. – gregblass

Trả lời

1

Chỉnh sửa cuối cùng (hy vọng):

Phải suy nghĩ lại điều này từ đầu. Tôi đi đến kết luận: Vì: id hoạt động như một ký tự đại diện, nhưng không được phép làm khóa của băm, tại sao không phải lúc nào cũng tạo các khóa 1-4, vì vậy tôi có thể đưa chúng vào danh sách trắng một cách rõ ràng, sau đó lấy ID từ khóa giá trị trong băm, giống như được thực hiện trong hình thức truyền thống làm tổ? Đó là cách tôi giải quyết nó. Dưới đây là việc thực hiện cuối cùng mà tôi đã làm việc:

<% i = @parent.derps.index(derp) + 1 %> 
<%= simple_fields_for "derps[#{i}]", derp do |f| %> 
    <%= f.hidden_field :id, value: derp.id %> 
    <%= render "rest_of_the_fields" %> 
<% end %> 

Sau đó, trong bộ điều khiển:

def update 
    @derps = [] 
    @rejects = [] 
    derp_params.each do |key, hash| 
    derp = Derp.find(hash.delete("id")) 
    derp.assign_attributes(hash) 
    @rejects << derp unless derp.save 
    end 
    if @rejects.empty? 
    redirect_to @parent, flash: {success: "Derps updated successfully."} 
    else 
    @derps = @rejects 
    render :edit 
    end 
end 

Sau đó, đây là những params mạnh:

def derp_params 
    p = [:id, :attribute_1, :another_attribute, ...] 
    params.require(:derps).permit(
    "1" => p, "2" => p, "3" => p, "4" => p 
) 
end 

Phew. Hy vọng điều này sẽ giúp một ai đó.

+1

Điều này chỉ hoạt động nếu bạn có thể đảm bảo rằng bạn không có nhiều hơn 4 bản ghi lồng nhau, phải không? Vì vậy, nó không có vẻ là một giải pháp đa năng cho vấn đề cơ bản. –

4

Tôi đã phát hiện ra rằng dòng lệnh là vô cùng hữu ích để gỡ lỗi thông số mạnh trong Rails 4. Đây là cách tôi đã kiểm tra vấn đề của bạn trong giao diện điều khiển:

rails C# From within your project directory, short for 'rails console' 

params = ActionController::Parameters.new({ derps: { 1 => { attribute: 39, another_attribute: "serp" }, 2 => { attribute: 30, another_attribute: 49 } } }) 

params # To make sure that the object looks the same 

permitted = params.require(:derps).permit(1 => [ :attribute, :another_attribute ], 2 => [ :attribute, :another_attribute ]) 

permitted # To see what you'd get back in your controller 

Hy vọng rằng với công cụ này, bạn sẽ có thể để gỡ lỗi mọi thứ mà câu trả lời của tôi không cung cấp dễ dàng hơn là dùng thử và lỗi.

+0

Mẹo hay về bảng điều khiển! Cảm ơn. – RichardAE

+0

Người đàn ông thực sự tuyệt vời. Cảm ơn bạn! – gregblass

0

Giải pháp tốt nhất tuyệt đối tôi đã nhìn thấy là here:

def product_params 
    properties_keys = params[:product].try(:fetch, :properties, {}).keys 
    params.require(:product).permit(:title, :description, properties: properties_keys) 
end 

tôi đã thực hiện một sự thay đổi hơn để lặp qua các phím giấu tên từ property_keys tôi có chìa khóa lồng nhau hơn và giá trị:

response_keys = params[:survey][:responses].try(:fetch, :properties, {}).keys 
params.require(:survey).permit(responses: response_keys.map {|rk| [rk => [:question_id, :answer_id, :value]]}) 
Các vấn đề liên quan