一键更新商品

时间:2019-06-24 14:13:58

标签: ruby-on-rails

我要一键更新存储在数据库中的Item。 例如,我有一个名为Car的模型。它具有称为“活动”的属性,该属性为布尔值,因此在DB中可以为0或1。我希望用户可以通过单击(例如从他们的汽车的索引页中单击)更改此属性。我知道,如果我要像整个表单一样使此按钮成为可能。但我认为这不是最佳解决方案,也不对。我能以其他方式实现它吗,也许创建特殊的link_to或类似的东西? 据我了解,它应该将CarsController的请求发送到update方法中,但是没有表单怎么办呢?

2 个答案:

答案 0 :(得分:2)

您只需要将link_toremote: true一起使用。 例如,您认为:

link_to "Activate", car_path(@car.id), method: :post, remote: true

在您的控制器方法中:

def active
  @car = Car.find(params[:id])
  @car.update(active: true)
  render json: :ok
end

完整的指南,here.

答案 1 :(得分:0)

如果使用的是jquery,则可以使用dataType为JSON的jquery ajax方法。 而且,您也可以使用相同的静态更新方法,即无需创建任何新方法。

查看- <%= button_tag 'Activate', car_id: "22" , id: "activate_car" %>

控制器-

  def update
    @car = Car.find(params[:id])
    respond_to do |format|
      if @car.update(car_params)
        format.html { redirect_to @car, notice: 'Car was successfully updated.' }
        format.json { render :json: 'Successfully update' }
      else
        format.html { render :edit }
        format.json { render json: @car.errors }
      end
    end
  end

  private

  def car_params
      params.require(:car).permit(:active)
  end

JS-

$(document).on("click", '#activate_car', function () {
  car_id = $(this).attr('car_id')
  $.ajax({
    url: "/cars/" + car_id,
    type: "PUT",
    data: {
      active: true
    },
    dataType: "json",
    success: function (response) {
      alert(response)
    }
  });
});