将rails路由传递给AJAX url值

时间:2016-10-16 23:17:56

标签: ruby-on-rails ajax routes

我有一个应用程序,用户的投资组合有很多位置,每个位置都有很多动作。因此,特定位置的关联移动索引页面的URL看起来像:portfolio_position_movements。我有一个索引页面,控制器操作看起来像

def index
  @movements = @position.movements.all
  respond_to do |format|
    format.html
    format.json { render json: @movements}
  end
end

我的moves.js文件中的ajax调用是:

var loadData = function(){
            $.ajax({
              type: 'GET',
              contentType: 'application/json; charset=utf-8',
              url: ?,
              dataType: 'json',
              success: function(data){
                drawBarPlot(data);
              },
              failure: function(result){
                error();
              }
            });
          };

如何传递动态路径路径,以便在任何位置对象上使用移动索引?

1 个答案:

答案 0 :(得分:0)

你可以在js文件中使用erb标签,对我来说,我按照以下方式使用:

#edit.js.erb

$modal = $('.modal'),
$modalBody = $('.modal .modal-body'),
$modalHeading = $('.modal .modal-heading');
$modalHeading.html("Edit <%= @student.full_name.titleize %>'s information");
$modalBody.html("<%= escape_javascript(render 'edit_student') %>");
$modal.modal();

注意:文件扩展名为.js.erb,因此rails可以处理它。我正在调用一个模态表单,student_controller.rb中的edit方法是:

 def edit
    @student = Student.find(params[:id])
    respond_to do |format|
      format.html # edit.html.erb
      format.js # edit.js.erb
      format.json { render json: @student }
    end
  end

编辑:

您可以将JS代码嵌入到html.erb中并使用rails路由,例如:

<script>
var loadData = function(){
            $.ajax({
              type: 'GET',
              contentType: 'application/json; charset=utf-8',
              url: <%= my_ajax_path %>,
              dataType: 'json',
              success: function(data){
                drawBarPlot(data);
              },
              failure: function(result){
                error();
              }
            });
          };
</script>

什么是my_ajax_path?

routes.rb中定义的铁路路线,例如我需要一个学生可以申请使用ajax的所有可用部分的列表,所以我做了以下工作:

1-在students_controllers.rb中定义了一个方法,如下所示:

  def available_sections
    batch_id =  (params[:batch_id].nil? || params[:batch_id].empty?) ? 0 : params[:batch_id].to_i

    if batch_id == 0
      @sections = [].insert(0, "Select Section")
    else
      batch = Batch.find(params[:batch_id])
      # map to name and id for use in our options_for_select
      @sections = batch.sections.map{|a| [a.section_name, a.id]}
    end
  end

2-在routes.rb

中添加了一条路线
resources :students do
  collection do
    get :available_sections
    post :create_multiple
  end
end

3-内部new.html.erb:

<script type="text/javascript">
$(document).ready(function() {
    $('.student_section_id').hide();
    $('#student_batch').change(function() {
        $.ajax({
            url: "/students/available_sections",
            data: {
                batch_id : $('#student_batch').val()
            },
            dataType: "script",
            success: function () {
                if (+$('#student_batch').val() > 0)
                {
                    $('.student_section_id').fadeIn();
                }
                else
                {
                    $('.student_section_id').fadeOut();
                }
            } 
        });
    });
});
</script>

忘记那些凌乱的代码:D因为这是我的第一步,但是你得到了重点,对于这一行url: "/students/available_sections"它应该使用rails路由你可以通过调用rails routes来获取它命令行以获取所有应用程序路由的列表