2013-05-13 33 views
56

Trong Rails 3, nó đã có thể chèn một thuộc tính vào params như vậy:Rails 4: Chèn Thuộc tính Into Params

params[:post][:user_id] = current_user.id 

Tôi đang cố gắng làm điều gì đó tương tự trong Rails 4, nhưng không có may mắn:

post_params[:user_id] = current_user.id 

. . . . 


private 

    def post_params 
    params.require(:post).permit(:user_id) 
    end 

Đường ray bỏ qua việc chèn này. Nó không ném bất kỳ lỗi nào, nó chỉ lặng lẽ thất bại.

Trả lời

115

Tìm câu trả lời here. Thay vì chèn thuộc tính từ bên trong hành động của bộ điều khiển, bạn có thể chèn nó vào định nghĩa params bằng cách hợp nhất. Mở rộng trên ví dụ trước đây của tôi:

private 

    def post_params 
    params.require(:post).permit(:some_attribute).merge(user_id: current_user.id) 
    end 
+3

Cảm ơn, tôi cần thiết để sử dụng deep_merge, bởi vì thuộc tính của tôi được lồng ... – stephenmurdoch

+0

@marflar bạn đã sử dụng 'deep_merge' bên trong hàm tạo params? Hoặc ở nơi khác trong bộ điều khiển của bạn? –

+0

Đây là cách tôi làm điều đó cũng nhưng tôi tiếp tục nghĩ rằng phải có một cách để DRY này lên một chút. Tất cả 50 bộ điều khiển của tôi có tuyên bố .merge tương tự trong vùng thông số nghiêm ngặt. Trong trường hợp của tôi, tôi hợp nhất current_user vào updated_by. Tôi kết hợp current_user thành created_by chỉ trong phương thức create. – Dan

27

Ngoài câu trả lời @ timothycommoner, bạn có thể luân phiên thực hiện việc hợp nhất trên cơ sở mỗi hành động:

def create 
    @post = Post.new(post_params.merge(user_id: current_user.id)) 
    # save the object etc 
    end 

private 
    def post_params 
    params.require(:post).permit(:some_attribute) 
    end 
+1

Hey, bạn sẽ làm thế nào cho một lồng nhau nguồn ? – Patient55

+0

Tôi không chắc tại sao nhưng câu trả lời của @ timothycommoner không phù hợp với tôi. chỉ cái này ... tôi thậm chí còn cố gắng 'hợp nhất!' và điều đó vẫn thất bại. Dù sao thì điều này cũng dễ đọc hơn vì không có phương pháp riêng trong đào tạo và dễ thay đổi hơn trong các ca sử dụng khác nhau – james

+0

@ Patient55 Tôi đoán bạn cần 'deep_merge' khi họ thảo luận trong các bình luận của câu trả lời đã chọn. – Wit

0

Là một thay thế cho trường hợp này, bạn có thể cần vượt qua thuộc tính qua scope:

current_user.posts.create(post_params)

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