以rails形式包含自定义参数

时间:2018-07-09 18:33:15

标签: javascript ruby-on-rails

我是Web开发的新手,并且遇到以下问题:

我有以下型号:

产品

class Product < ApplicationRecord
  has_and_belongs_to_many :steps
end

步骤

class Step < ApplicationRecord
  has_and_belongs_to_many :products
end

产品步骤

class ProductsStep < ApplicationRecord
  belongs_to :product
  belongs_to :step
end

我有一个带有多个按钮的表单,应该选择这些按钮以指示属于该产品的步骤。

Buttons

我需要将选择作为参数的步骤发送到我的产品控制器,但是我不知道如何。我试图使用JS保存此信息,但我不知道如何发送它。

   function add_h(){
    #detecting if the button is selected or not
    btn_on = document.getElementById("hyd_on");
    btn_off = document.getElementById("hyd_off");
    if(btn_on != null){
      #adding the step related to the selected button
      <% @steps << Step.where(:id => 1) %>
      <% puts "#{@steps.count}" %>
      btn_on.style.background='#686761';
      btn_on.style.border='#686761';
      btn_on.setAttribute("id", "hyd_off");
    }else if (btn_off != null){
      #removing the step
      <% if @steps.count < 0 then @steps.where(:id => 1).first.destroy end %>
      <% puts "#{@steps.count}" %>
      btn_off.style.background='#d463c5';
      btn_off.style.border='#d463c5';
      btn_off.setAttribute("id", "hyd_on");
    }
  }

在控制器中,我正在这样做:

 def new
    @product = Product.new()
    @steps = Array.new()
    if Product.all.any?
      @product.id = Product.last.id + 1
    else
      @product.id = 1
    end
  end

def create
    @product = Product.new(product_params)
end

我的印象是我做错了一切。我不知道JS是否是最好的方法,但我想不出什么。

1 个答案:

答案 0 :(得分:0)

我注意到的第一件事是,在has_and_belong_to_many中,数据库中需要有一个像model1s_model2s这样的联合表(模型名的复数结尾s)。虽然不需要该联合表的特定模型。

那我不确定您是否需要

products_steps

class ProductsStep < ApplicationRecord   
belongs_to :product  
belongs_to :step 
end

您还想创建新产品吗?

然后是一个问题:为什么要在product_id操作中显式设置new?创建产品模型的新实例时,数据库将设置ID。您一定会自己设置id来面对比赛条件。

关于JS的另一件事:为什么?您可以只添加要使用CSS设计的不同复选框(颜色,如果选中则为其他颜色...)。您可以为这些不同的复选框指定步骤的名称:Hydratacao,nutricao ...并检查您的create操作是否存在参数params[:product}[:nutricao].present?,如果存在,则添加新产品的关系...此外,您还需要收集新操作中的所有步骤,并执行@steps = Step.all而不是@steps = Array.new(),然后在您的视图中可以通过遍历刚刚收集的所有步骤来创建复选框。

最后,在create动作中,您实例化一个新对象,而不是创建它。您应该执行@product = Product.create(product_params)而不是@product = Product.new(product_params)。另外,您可能必须手动添加步骤,我不确定可以通过witelisting添加这些步骤,但是您可以尝试。

(一个建议:在http://guides.rubyonrails.org/getting_started.html进行初学者教程,您会更熟悉Rest和Crud的概念)