使用rails 4的Ajax表单:remote=>;true和JQuery—最佳实践是什么?

使用rails 4的Ajax表单:remote=>;true和JQuery—最佳实践是什么?,jquery,ruby-on-rails,ajax,partial,Jquery,Ruby On Rails,Ajax,Partial,我正在Rails 4中使用ajax构建一个多部分表单,我想知道我是否以正确的方式完成了这项工作 这是我到目前为止使用的策略。我的控制器叫做ajaxform 在ajaxform_controller.rb的顶部,在类定义内部,但不是在函数中,我有 respond_to :js 第一阶段 从另一个视图到该工具的链接通过 get 'ajaxform' => 'ajaxform#stage_one' 主视图“stage_one.html.erb”包含表单的第一部分,使用:remote=>tru

我正在Rails 4中使用ajax构建一个多部分表单,我想知道我是否以正确的方式完成了这项工作

这是我到目前为止使用的策略。我的控制器叫做ajaxform

在ajaxform_controller.rb的顶部,在类定义内部,但不是在函数中,我有

respond_to :js
第一阶段

从另一个视图到该工具的链接通过

get 'ajaxform' => 'ajaxform#stage_one'
主视图“stage_one.html.erb”包含表单的第一部分,使用:remote=>true选项使用表单标记定义。同名的控制器方法为空

<%= form_tag("/stage_one_form", method: 'post', :remote => true) do %>
    <%= label_tag(:stage_one_data, "Stage one data: ") %>
    <%= select_tag(:stage_one_data, options_for_select([['Option1', :option1], ['Option2', :option2], ['Option3', :option3]], 1)) %>
    <%= submit_tag 'Next' %><span id="stage_two_waiting" style="display:none;"></span>
<% end %>
<br />
<span id="stage_two_form" style="display:none;"></span>
stage_two_waiting是包含两个文件的局部视图:stage_two_waiting.js.erb和stage_two_waiting.html.erb。html.erb文件开头的下划线表示该文件是部分文件,但同名的.js.erb文件没有下划线

这里是stage_two_waiting.js.erb

$('span#stage_two_waiting').append("<%= escape_javascript (render partial: 'stage_two_waiting') %>");
$('span#stage_two_waiting').slideDown(350);
$("#trigger_stage_two").trigger("submit.rails");
stage_two_form还有两个文件,stage_two_form.js.erb和stage_two_form.html.erb。在渲染这些文件之前,控制器需要进行REST调用

def stage_two_form
    stage_one_selected_option = params[:stage_one_data]    
    rest_response = `curl -k -X GET https://myrestservice.net/v1/myfunction/#{stage_one_selected_option}`

    #convert the rest response into an array of select list options for the stage two form
    @stage_two_options = Array.new
    @stage_two_options.push "parsed information from rest_response would go in here"

    respond_with(@stage_two_options) do |format|
      format.js
    end
end
stage_two_form.js.erb如下所示:

$('span#stage_two_form').append("<%= escape_javascript (render partial: 'stage_two_form') %>");
$('span#stage_two_form').slideDown(350);
后续阶段

第三阶段共有四个文件,两个用于等待消息,两个用于表单。它们是stage\u three\u waiting.js.erb、stage\u three\u waiting.html.erb、stage\u three\u form.js.erb和stage\u three\u form.html.erb。与之前一样,第三阶段的等待部分在其内部有一个隐藏的形式,用于传递第二阶段所需的任何参数。使用JQuery append在_stage_two_form.html.erb中的span标记内部呈现阶段三部分。这一过程可以根据需要持续多个阶段

问题

对于我来说,多部分表单的每个“阶段”都应该依赖于位于最多五个不同位置的代码似乎有点过分:两个文件用于“请等待…”消息,两个文件用于表单本身,控制器方法中的代码。需要将数据作为隐藏字段中的参数从一个阶段传递到下一个阶段似乎也很奇怪。它很笨拙,而且表单也因为某种原因无法在safari 8中工作,因为它一直以HTML的形式进行路由,并且忽略了JQuery

结论

我怀疑我没有以最优雅的方式来做这件事——任何帮助都将不胜感激


问题是-可以使用这些隐藏字段将参数中的数据从一个局部视图传递到另一个局部视图吗,或者有没有一种更干净的方法可以做到这一点,而不涉及这么多不同的文件和隐藏字段?

全局变量通过隐藏字段将参数从局部视图传递到局部视图的另一种方法是在控制器中使用全局变量(以$开头)。这使它们可用于控制器的任何视图及其在控制器本身中的所有功能

ajaxform\u controller.rb

def stage_two_form
    # define a global variable that we expect to use later from a different partial
    $global_selected_option = params[:stage_one_data]
    ...
end

def stage_three_form
    # the "stage_three_form" method still has access to the global variable
    $stage_three_option = $global_selected_option + ' In stage 3'
end
<!-- _stage_three_form.html.erb and all other partial views have access to globals -->
<p>The original option was: <%= $global_selected_option %></p>
<%= form_tag("/stage_three_form", method: 'post', :remote => true) do %>
      <%= label_tag(:stage_three_selection, "#{$stage_three_option}") %>
      ...
<% end %>
\u stage\u three\u form.html.erb

def stage_two_form
    # define a global variable that we expect to use later from a different partial
    $global_selected_option = params[:stage_one_data]
    ...
end

def stage_three_form
    # the "stage_three_form" method still has access to the global variable
    $stage_three_option = $global_selected_option + ' In stage 3'
end
<!-- _stage_three_form.html.erb and all other partial views have access to globals -->
<p>The original option was: <%= $global_selected_option %></p>
<%= form_tag("/stage_three_form", method: 'post', :remote => true) do %>
      <%= label_tag(:stage_three_selection, "#{$stage_three_option}") %>
      ...
<% end %>

最初的选择是:

正确)do%> ...
这类问题更适合您,因为您正在寻找有关代码的评论和一般建议。不是一个具体问题的答案。-1 Stackoverflow不是一个论坛-我们没有线程-我们有问题和答案,这个问题不太适合格式。也许我不够清楚-具体的问题是:什么是最好的方式来做这件事?我这样做对吗?像这样的全局变量会在像Heroku这样的PaaS上工作吗?另一个选择是将变量放在会话cookie中。我不能真正谈论PaaS和全局变量——但Ruby社区通常不喜欢全局变量。
      <%= hidden_field_tag(:stage_two_options, @stage_two_options) %>
post 'stage_two_form' => 'ajaxform#stage_three_waiting'
def stage_two_form
    # define a global variable that we expect to use later from a different partial
    $global_selected_option = params[:stage_one_data]
    ...
end

def stage_three_form
    # the "stage_three_form" method still has access to the global variable
    $stage_three_option = $global_selected_option + ' In stage 3'
end
<!-- _stage_three_form.html.erb and all other partial views have access to globals -->
<p>The original option was: <%= $global_selected_option %></p>
<%= form_tag("/stage_three_form", method: 'post', :remote => true) do %>
      <%= label_tag(:stage_three_selection, "#{$stage_three_option}") %>
      ...
<% end %>