将父值传递给简单形式

时间:2015-05-12 14:00:18

标签: ruby-on-rails ruby 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:

  simple_form_for @service do |f| 

此代码的工作形式为:

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

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

我该怎么做?

1 个答案:

答案 0 :(得分:2)

为什么不在控制器中将项目设置为服务?

  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字段。

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