如何在 JavaScript 中调用 Rails 方法

我是 ruby on Rails 的新手,我想从 javascript 调用控制器方法


显示.html.erb


<label class="switch">

  <%if @vehicle.parking%>

    <input type="checkbox" checked onchange="parkingMode(<%= @vehicle.id %>)">

  <%else%>

    <input type="checkbox" onchange="parkingMode(<%= @vehicle.id %>)">

  <%end%>

  <span></span>

</label>

车辆控制器.rb


def change_parking

  vehicle = Vehicle.find(params[:vehicle_id])

  if !vehiculo.parking

    vehicle.parking = true

    vehicle.save

  else

    vehicle.parking = false

    vehicle.save

  end

end

车辆.js


function parkingMode(id){

    console.log(id)

}


慕雪6442864
浏览 161回答 2
2回答

HUH函数

您无法直接从视图内调用 Rails 控制器方法,您需要向其发送请求。一个好的方法是使用表格:<%= form_for(@vehicle) do |f| %>&nbsp; <input name="parked" type="checkbox" checked="<%=@vehicle.parked%>" />&nbsp; <input type="submit" /><%= end %>然后您的控制器可以根据是否检查来更新车辆params[:parked]并重定向回同一页面def change_parked&nbsp; @vehicle.update_column(:parked, params[:parked])&nbsp; redirect_to vehicle_path(@vehicle.id)end这样做的好处是您不需要任何 JavaScript 即可对车辆进行更改。但是,如果您想避免页面刷新......要在没有表单的情况下执行此操作,您需要使用 JavaScript 和 Ajax 来 ping 路由到该控制器方法的端点。所以,你的parkingModeJavaScript 方法可能是这样的(为了方便起见,我在这里使用 jQuery)const request = $.post('/vehicles/change_parking')request.done((response) => {&nbsp; console.log('Do something here')})这将调用您的控制器方法,该方法可能返回JSON以下结果:def change_parking&nbsp; vehicle = Vehicle.find(params[:vehicle_id])&nbsp; if !vehiculo.parking&nbsp; &nbsp; vehicle.parking = true&nbsp; &nbsp; vehicle.save&nbsp; else&nbsp; &nbsp; vehicle.parking = false&nbsp; &nbsp; vehicle.save&nbsp; end&nbsp; render json: { vehicle: vehicle }, status: 200end然后您需要更改checked复选框的值:const request = $.post('/vehicles/change_parking')request.done((response) => {&nbsp; $('input[type="checkbox"]).attr('checked', response.responseJSON.vehicle.parked)})我想谈几件事。首先,当您可以将其简化为类似以下内容时,您if在视图中使用了一个语句:<input type="checkbox" checked="<%= @vehicle.parked %> onchange="parkingMode(<%= @vehicle.id %>)">这意味着仅checked当车辆停放时才会出现该复选框。其次,在你的change_parking方法中,你只需要调用save一次def change_parking&nbsp; vehicle = Vehicle.find(params[:vehicle_id])&nbsp; if !vehiculo.parking&nbsp; &nbsp; vehicle.parking = true&nbsp; else&nbsp; &nbsp; vehicle.parking = false&nbsp; end&nbsp; vehicle.saveend您也可以执行类似操作vehicle.parking = !vehicle.parking并删除该if语句。

SMILET

您可以使用 JS 调用控制器操作。但不是直接的。但是,您可以使用 Rails 已经提供的工具来执行此操作。首先,我们渲染一个远程复选框:check_box_field 'parking_mode_toggle', '1', false, remote: true, data: { url: '/change_parking' }尽管官方文档中没有给出,但如果您阅读Rails UJS代码,您会发现只要勾选/取消勾选复选框,UJS驱动程序就会发出请求。然后,在您的控制器中,您可以执行以下操作:def change_parking  # TODO: Change your database state according to the +params+ received  respond_to do |format|    format.js { render js: 'parkingMode()' }  endend
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript