AJAX在不同的控制器上更新不同的ID

时间:2019-02-26 02:05:32

标签: ruby-on-rails

我的应用与一个航班有很多乘客的关系。就是这样。

我有一个“飞行表演视图”,其中显示了分配给该航班的所有乘客,并且运行良好。

def show
 @passengers = @flight.passengers.order('is_checked ASC, is_boarded ASC, name ASC')
end

但是我的问题是,现在我想添加一个部分以进行ajax调用,以像表格一样更新乘客(带有remote:true),以基于文本字段更新乘客的单个参数。例如:

在我的表演视图中,我有一个text_field,如果我写“ Passenger name 1”,我希望在单击提交时将该乘客的“ is_boarded”列更新为true。

我面临的问题是,当我尝试执行此操作时,我无法选择该乘客的ID并将其发送给更新的controllers(我将有条件地在update passenger方法中仅更新该字段(可能由推荐人检查),因为我在航班管制员那里。

我的想法是使用带有remote的form_tag:与基于文本框上编写的文本由jQuery更改的动作相同,但甚至强制对特定ID进行直接动作(在这种情况下为55)我无法做出这个:

<%= form_tag('/passengers/55/edit', method: :post, remote: true) do %>

    <%= text_field_tag 'name' %>

    <%= submit_tag %>

<% end %>

也尝试使用“更新”代替“编辑”,但是没有用。

但是我在控制台上看到的是:

Started POST "/passengers/55/edit" for 127.0.0.1 at 2019-02-25 22:55:00 -0300
Processing by PassengersController#index as JS

也许我应该在passenger#index上使用response_to修复此问题?如果可以,怎么办?

如果这工作太多,也许可以帮助我寻找正确的东西?谢谢您的时间!

1 个答案:

答案 0 :(得分:0)

因此,您在此问题上有多个步骤,但都不应该太难于实施。 -从@passengers实例变量中选择单个乘客。 -为此特定更新创建新路线 -在显示页面上通过Ajax更新单个乘客

首先,而不是涉及任何类型的文本识别或解析,并避免人为错误等。为什么不输入名称,为什么不使用选择框呢?像这样的东西

<%= select_tag :passenger_id, options_for_select(@passengers.all.map {|pass| [pass.name, pass.id]}), {:include_blank => 'Select A Passenger'} %>

如果将其替换为文本字段,则会创建一个下拉框,将名称链接到ID。

接下来,由于这只是一个快速的布尔型开关,而且具有动态方面,因此,我建议为其创建一个新的Restful Patch路由和控制器操作(Rails Routing 2.10添加更多RESTful操作);

//routes.rb 

resources :passengers do
    member do
        patch "onboard"
        put "onboard"
    end
end

然后在您的Controller中使用toggle方法,它会切换属性(如果您按下两次,它将返回false)并保存它;

//passenger_controller.rb
def onboard
    respond_to do |format|
        @passenger = Passenger.find(params[:id])
        @passenger.toggle!(:onboard)
        format.html {}
        format.json {}
    end
end

我只是假设您不希望在此之后(即,正在进行的登机过程)加载新页面,因此response_to块以空标题结尾。

这全部归结为,您现在有了可以从表单调用的辅助更新路径(“ edit”和“ onboard”)。如果您运行rails routes命令,则会在此处看到它。现在将其放入您的html中,您应该会很好。

<%= form_tag(onboard_passenger_path, method: :post, remote: true) do %>

   <%= select_tag :passenger_id, options_for_select(@passengers.all.map {|pass| [pass.name, pass.id]}), {:include_blank => 'Select A Passenger'} %>

    <%= submit_tag %>

<% end %>

未经测试的代码,可能需要一两个步骤才能解决,但应该没问题。