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