【问题标题】:Rails 4 has_many :through with collection_check_boxes and additional join table text_fieldRails 4 has_many:通过collection_check_boxes和额外的连接表text_field
【发布时间】:2015-09-16 16:13:16
【问题描述】:

我已经搜索了整个互联网,但我无法让这些表格正常工作。事情是这样的:

我有两个模型通过 has_many 连接:通过连接模型:

estoque.rb

class Estoque < ActiveRecord::Base
  has_many :mpm_ests
  has_many :ordem_de_servicos, :through => :mpm_ests, dependent: :destroy
end

ordem_de_servico.rb

class OrdemDeServico < ActiveRecord::Base
  has_many :mpm_ests, dependent: :destroy
  has_many :estoques, :through => :mpm_ests
  accepts_nested_attributes_for :mpm_ests
end

以及连接模型mpm_est.rb

class MpmEst < ActiveRecord::Base
  belongs_to :ordem_de_servico
  belongs_to :estoque
end

我想要做的是用一个名为 quantidade(数量)的嵌套额外文本字段创建一个 collection_check_boxes,因为我已经设置了连接表:

连接表的迁移文件(mpm_est):

class CreateMpmEsts < ActiveRecord::Migration
  def change
    create_table :mpm_ests do |t|
    t.integer :ordem_de_servico_id
    t.integer :estoque_id
    t.string :quantidade
  end
    add_index :mpm_ests, :ordem_de_servico_id
    add_index :mpm_ests, :estoque_id
    add_index :mpm_ests, [:ordem_de_servico_id, :estoque_id], unique: true
  end
end

但问题是我不知道如何在我的控制器和视图中执行此操作。我尝试过类似的方法,但没有成功。

ordem_de_servicos_controller.rb

def new
  @ordem_de_servico = OrdemDeServico.new
  @ordem_de_servico.mpm_ests.build
end

def edit
  @ordem_de_servico.mpm_servs.build
  @ordem_de_servico.mpm_ests.build
end

[...]

 def ordem_de_servico_params
      params.require(:ordem_de_servico).permit(:cliente_id, :veiculo, :placa, :mecanico_id, {:estoque_ids => []}, :quantidade, :prazo, :pago, :valor_pago, :historico_pgto, :status)
    end

在我的 ordem_de_servico _form 视图中:

<%= f.fields_for :mpm_ests do |ff| %>
      <%= ff.collection_check_boxes(:ordem_de_servico, :estoque_ids, Estoque.all, :id, :nome) %>
      <%= ff.text_field :quantidade %><br>
<% end %>

编辑 1

我想要做的基本想法是这样的:

<!DOCTYPE html>
<html>
<body>

<h1>Ordem De Servico (Service)</h1>

<label>Number<label>
<input type="text">

<label>Service<label>
<input type="text">

<label>Person<label>
<input type="text">

<h5>Inventory (estoque)</h5>
<form action="">
<input type="checkbox" name="vehicle" value="Bike">Iron   <label>Quantity<label><input type="text"><br>
<input type="checkbox" name="vehicle" value="Car">copper   <label>Quantity<label><input type="text"><br>
<br><button>Save Ordem de Servico (service)</button>
</form>

</body>
</html>

【问题讨论】:

    标签: ruby-on-rails forms activerecord rails-4-2-1


    【解决方案1】:

    我并不是说这是完整的答案,但我认为您正在尝试使用嵌套属性和 collection_check_boxes 保存选定的复选框。它基本上会发送 estoque_ids 数组,如果是这样,下面的代码将起作用,您可以将其用作进一步修改的参考。

    迁移(将类型指定为 estoque_ids 的数组)

    class CreateMpmEsts < ActiveRecord::Migration
      def change
        create_table :mpm_ests do |t|
          t.integer :ordem_de_servico_id 
          t.string :quantidade
          t.text :estoque_ids, array: true, default: []
    
          t.timestamps null: false
        end
      end
    end
    

    形式(新秩序德服务)

    <%= f.fields_for :mpm_ests do |ff| %> 
          <%= ff.collection_check_boxes(:estoque_ids, Estoque.all, :id, :name) do |b|
              b.label { b.check_box }
            end
            %>
          <%= ff.text_field :quantidade %><br>
    <% end %>
    

    控制器(根据需要允许参数)

    def create
        @ordem_de_servico = OrdemDeServico.new(ordem_de_servico_params)
    
        respond_to do |format|
          if @ordem_de_servico.save
            format.html { redirect_to @ordem_de_servico, notice: 'Ordem de servico was successfully created.' }
            format.json { render :show, status: :created, location: @ordem_de_servico }
          else
            format.html { render :new }
            format.json { render json: @ordem_de_servico.errors, status: :unprocessable_entity }
          end
        end
      end
    private
    def ordem_de_servico_params
      params.require(:ordem_de_servico).permit! #permit params u need
    end
    

    编辑 1:

      <div class="field">
          <% Estoque.all.each_with_index do |es,index| %>
                <div>
                    <%= check_box_tag "ordem_de_servico[mpm_ests_attributes][#{index}][estoque_id]", es.id%>
                    <%= es.name %>
                    <%= text_field_tag "ordem_de_servico[mpm_ests_attributes][#{index}][quantidade]", :quantidade %><br>
                </div>
            <% end %>  
      </div>
    

    【讨论】:

    • 感谢您的快速答复,您的代码运行良好。然而,这段代码在数据库中存储了一个数组,其中所有 estoque_ids 都在一个字段中,因此是一个记录。我想做的是为每个关系(estoque_id 和 ordem_de_servico_id)存储不同的数量。例如,您的建议是在一条记录中我可以只为选中的复选框 estoque_ids 存储一个数量,但我需要在连接表中为每个 estoque_id 存储一个数量。
    • 检查我的编辑部分回答...您是否期​​望与 collection_check_boxes 有相同的行为? ...让我知道这一点:)
    • 如果我能以某种方式在控制器中使用参数 :quantidade 构建这个@ordem_de_servico.mpm_ests.build 会更好,因为将字段 estoque_ids 作为文本并按照您的建议执行,不幸的是,不会记录一个 id DB中的一个数量。所以我想到的是有一个带有 ordem_de_servico_id(integer) estoque_id(integer) 和 quantidade(string) 的表,并让 rails 使用 text_field 建立 collection_check_boxes 的链接,并将这些参数一起保存在 DB 中。谢谢。
    • 我试图举一个我需要的例子,请在我的帖子中查看我的编辑 1。非常感谢。
    • 您是否在 Edit1 中检查了我的代码 .. 它确实像您的问题(编辑 1)一样单独保存了关系 .. 如果这不正确或您需要对其进行什么更改,请告诉我... . 只需将我的编辑 1 代码放在表单视图中的答案中并检查它是否会将 Estoque id、OrdemDeServico id 和 quantidade 保存为一条记录.. 你想对 collection_check_boxes 做同样的事情吗?
    猜你喜欢
    • 2014-09-22
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多