将父值传递给简单形式

Passing parent value to simple form

我有一个项目,要向项目添加服务,我将项目 ID 传递给服务:

new_service_path(project: "#{@id}")

然后我的服务控制器找到项目:

  def new
    @service = Service.new
    @project = Project.find(params[:project])
    @service.documents.build
  end

我可以在视图中显示项目,但我想将项目 ID 保存到服务记录以创建关联。我正在使用简单表格:

  simple_form_for @service do |f| 

此代码以以下形式工作:

   <% if @project %>
      <%= f.association :project, selected: @project.id %>
  <% else %>
      <%= f.association :project %>
  <% end %> 

但是,如果我有一个项目,我想跳过使用 f.association 和 select 框创建的 selection 过程,只需将 project_id 添加到我的服务对象。

我该怎么做?

为什么不在controller中把Project设置成Service呢?

  def new
    @service = Service.new
    @project = Project.find(params[:project])
    if @project
      @service.project = @project
    end
    @service.documents.build
  end

那么项目的表格就是:

<%= f.association :project %>

无论如何,您可以在提交表单时将项目 ID 传递到下一个路由,例如 simple_form_for @service, :url => create_project_path(project: @project.id) do |f| 然后接受该参数并在 create 方法中设置该关联:

  def new
    @service = Service.new
    @project = Project.find(params[:project])
    @service.documents.build
  end

  def create
    @service = Service.new
    @project = Project.find(params[:project])
    if @project
      @service.project = @project
    end
    # ... other logic
  end

然后像您在问题中所做的那样隐藏 project 字段。

隐藏输入可能是另一种方法,但我认为这不是最好的方法。