我是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
我有一个带有多个按钮的表单,应该选择这些按钮以指示属于该产品的步骤。
我需要将选择作为参数的步骤发送到我的产品控制器,但是我不知道如何。我试图使用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是否是最好的方法,但我想不出什么。
答案 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的概念)