ruby-on-rails 如何一次点击更新项目?

qltillow  于 2023-01-03  发布在  Ruby
关注(0)|答案(3)|浏览(149)

我想用一次点击更新存储在我的数据库中的项目。例如,我有一个叫汽车的模型。它有一个叫“活动”的属性,这是布尔的,所以可能是0或1在数据库中。我想让用户有可能用一次点击来改变这个属性,例如从他们的汽车索引页。我知道,如果我想让这个按钮像整个表单一样,它可以完成。但我认为这不是最好的解决方案,也不是正确的。我可以用任何其他的方式,也许创建特殊的链接或类似的东西?据我所知,它应该发送请求到CarsController到更新方法,但如何做到这一点没有形式?

wvmv3b1j

wvmv3b1j1#

您只需将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.

qzwqbdag

qzwqbdag2#

如果你使用jquery,你可以使用jquery ajax方法,dataType作为JSON,你也可以使用相同的restful更新方法,即不创建任何新方法。
视图-<%= 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)
    }
  });
});
htrmnn0y

htrmnn0y3#

我知道我来晚了,但是为新的rails开发人员添加这个答案
您只需将link_toremote: true一起使用。如果link_to引发路由错误,则使用button_to代替。例如,在您的视图中:

button_to "Activate", car_path(@car.id), method: :patch, remote: true

在控制器方法中:

def active
  @car = Car.find(params[:id])
  @car.update(active: true)
  redirect_to cars_path(@cars), status: :see_other
end

还有你的路线。

resources :cars do
      member do
        patch :active
      end
    end

相关问题