2013-06-27 27 views
13

Tôi đang gặp một vấn đề khắc phục yêu cầu params mạnh mới trong Rails 4 sử dụng Hstore và accessors độngray 4 params mạnh + phím hstore động

Tôi đã một cột Hstore gọi :content mà tôi muốn sử dụng để lưu trữ nội dung trong nhiều ngôn ngữ, tức là :en, :fr, v.v. Và tôi không biết ngôn ngữ nào trả trước để đặt chúng trong mô hình hoặc bộ điều khiển.

store_accessor :content, [:en, :fr] #+226 random other il8n languages won't work. 

Làm cách nào để ghi đè tham số mạnh (hoặc cho phép khóa cửa động) trong đường ray 4 cho một cột?

params.require(:article).permit(
    :name, :content, 
    :en, :fr #+226 random translations 
) 

ngắn của ...

params.require(:article).permit! 

trong đó tất nhiên không làm việc.

+0

bố cục trông như thế nào đối với dữ liệu hstore động này? – parzival

Trả lời

15

Nếu tôi hiểu chính xác, bạn muốn đưa vào danh sách trắng một mã băm của các phím động. Bạn có thể sử dụng một số mã ruby như sau để thực hiện việc này:

Điều này làm việc cho tôi, hy vọng điều này sẽ hữu ích!

+1

làm cách nào tôi có thể cho phép bất kỳ bộ khóa nào, chứ không phải là danh sách trắng. ví dụ: nếu tôi muốn cho phép người dùng tạo tên khóa của mình: Đây là câu hỏi của tôi: http: //stackoverflow.com/questions/19054535/setting-hstore-in-rails4-dynamic-key-values –

2

Tôi đang làm điều gì đó tương tự và thấy điều này là một chút sạch hơn và hoạt động tốt.

Giả sử một mô hình gọi là Article bạn có thể truy cập vào :content của bạn lập chỉ mục stored_attributes như thế này: Article.stored_attributes[:content]

Vì vậy params mạnh mẽ của bạn trông như thế này:

params.require(:article).permit(:name, content: Article.stored_attributes[:content]) 

Giả sử params của bạn được cấu trúc như sau: {bài viết => {name: "", content: [en, fr, ..]}}

0

Như mọi người đã nói, không đủ để cho phép: param nội dung - bạn cũng cần cho phép các khóa trong mã băm . Giữ mọi thứ trong chính sách, tôi đã làm như vậy:

# in controller... 

    def model_params 
    params.permit(*@policy.permitted_params(params)) 
    end 

    # in policy... 

    def permitted_params(in_params = {}) 
    params = [] 

    params << :foo 
    params << :bar 

    # ghetto hack support to get permitted params to handle hashes with keys or without 

    if in_params.has_key?(:content) 
     content = in_params[:content] 
     params << { :content => content.empty? ? {} : content.keys } 
    end 
    end 
Các vấn đề liên quan