0

Привет, я столкнулся с проблемой с моим кодом, где я не уверен, где использовать сильные параметры. В этом случае у меня есть объект документа, который задается с набором предустановленных значений и значений, исходящих из моей формы, например.Использование сильных параметров при назначении атрибутов модели в контроллере

class DocumentsController < ApplicationController 
def add_document 
    document_name = params[:document_name] 
    document_parent_id = params[:doc_parent_id] 

    @document = Document.new(name: document_name, parent_id: document_parent_id, document_owner_id: current_user_id, created_by: current_user.name) 
    @document.save 
    #do flash stuff here 
end 

Таким образом, форма отправляет только имя документа и идентификатор родителя документа через хеш params. Должны ли эти два значения использоваться в белых списках с использованием сильных параметров? И если да, то как я могу использовать сильные параметры для создания нового документа с другими значениями, которые не поступают из моей формы.

Спасибо.

ответ

0

1/Да, это должно быть в белом списке.

def add_document 
    # stuff 
    @document = Document.new(document_params.merge(
    document_owner_id: current_user_id, 
    created_by: current_user.name 
)) 
    # stuff 
end 

def document_params 
    params.require(:document).permit(:name, :parent_id) 
end 

2/Чтобы представить не из формы, вам просто нужно представить вложенный атрибут document внутри Params наряду с другим Params:

{ document: { name: '<Name>', parent_id: '<Id>' }, other_params: '...' } 
0
class DocumentsController < ApplicationController 
    def add_document 
    @document = Document.new document_params.merge(document_owner_id: current_user_id, created_by: current_user.name) 
    @document.save 
    end 

    private 

    def document_params 
    params.permit(:document_name, :doc_parent_id) 
    end 

end 

Ваш код действительно может сделать с улучшением много.

Во-первых, Rails 4+ конвенция должна иметь «верхнего уровня» Значение параметра модели (в вашем случае document):

params: { 
    document: { 
     document_name: "x", 
     doc_parent_id: "y" 
    } 
} 

Это позволит вам вызвать сильный метод Params правильно:

def document_params 
    params.require(:document).permit(:document_name, :doc_parent_id) 
end 

путь к достижению этой цели является использовать form_for (который должен быть использован в сочетании с RESTful контроллером):

#app/views/documents/new.html.erb 
<%= form_for @document do |f| %> 
    <%= f.text_field :document_name %> 
    <%= f.submit %> 
<% end %> 

#app/controllers/documents_controller.rb 
class DocumentsController < ApplicationController 
    def new 
     @document = Document.new 
    end 

    def create 
     @document = Document.new document_params 
     @document.save 
    end 
end 

-

Наконец, вам также необходимо убедиться, что имена атрибутов модели работают хорошо.

В настоящее время вы используете document_name в качестве имени атрибута. Если бы это была моя заявка, я бы назвал ее name, что позволит вам позвонить в @document.name в будущем.

То же самое для других атрибутов:

document_name -> "name" 
doc_parent_id -> "parent_id" 
document_owner_id -> "owner_id" 

 Смежные вопросы

  • Нет связанных вопросов^_^