如何从rails中的控制器调用方法?

时间:2014-03-31 14:16:12

标签: jquery ruby-on-rails ruby ajax

如何从r_holidays_controller调用方法?

这是我尝试编写脚本,但它不起作用。

$(function () {
        $('#toright').click(function () {
            var sel = document.getElementById("left");
            var len = sel.options.length;
            var w_id = this.getAttribute('w_id');
            for (var i = 0; i < len; i++) 
                {
                if(sel.options[i].selected) 
                    {
                    $.ajax("/r_holidays/w_destroy", {holiday_id: sel.options[i].value, group_id: w_id}).done(function(data){});
                    }
                }
            history.go(0);
        })
      });

我认为,$.ajax( ... )中必定存在错误。

所有人都有想法让这个有效吗? 在检查我的路径时,我意识到,我没有被列出......

r_holidays_path      GET     /r_holidays(.:format)           r_holidays#index
                     POST    /r_holidays(.:format)           r_holidays#create
new_r_holiday_path   GET     /r_holidays/new(.:format)   r_holidays#new
edit_r_holiday_path  GET     /r_holidays/:id/edit(.:format)  r_holidays#edit
r_holiday_path       GET     /r_holidays/:id(.:format)   r_holidays#show
                     PATCH   /r_holidays/:id(.:format)       r_holidays#update
                     PUT     /r_holidays/:id(.:format)   r_holidays#update
                     DELETE  /r_holidays/:id(.:format)   r_holidays#destroy 

编辑:

这是我的控制器代码:

class RHolidaysController < ApplicationController
  before_action :set_r_holiday, only: [:show, :edit, :update, :destroy]

  def index
    @r_holidays = RHoliday.all
  end

  def new
    @r_holiday = RHoliday.new
  end

  def edit
  end

  def create
    render json: RHoliday.find_or_create(holiday_id: params[:holiday_id].to_s, group_id: params[:group_id].to_s) 
  end  

  def w_create
    @r_holiday = RHoliday.new(r_holiday_params)

    respond_to do |format|
      if @r_holiday.save
        format.html { redirect_to @r_holiday, notice: 'RHoliday was successfully created.' }
        format.json { render action: 'show', status: :created, location: @r_holiday }
      else
        format.html { render action: 'new' }
        format.json { render json: @r_holiday.errors, status: :unprocessable_entity }
      end
    end
  end  

  def update
    respond_to do |format|
      if @r_holiday.update(holiday_params)
        format.html { redirect_to @r_holiday, notice: 'RHoliday was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @r_holiday.errors, status: :unprocessable_entity }
      end
    end
  end

  def destroy
    @r_holiday.destroy
    respond_to do |format|
      format.html { redirect_to holidays_url }
      format.json { head :no_content }
    end
  end

  def w_destroy
    render json: RHoliday.where(holiday_id: params[:holiday_id].to_s, group_id: params[:group_id].to_s).destroy 
  end




  private
    def set_holiday
      @r_holiday = RHoliday.find(params[:id])
    end

    def holiday_params
      params.require(:r_holiday).permit(:holiday_id, :group_id)
    end

end

我的routes.rb中的相关行只是resources :r_holidays

4 个答案:

答案 0 :(得分:2)

我认为你在$.get使用$.ajax语法。

尝试将$.ajax替换为$.get

答案 1 :(得分:1)

你的代码似乎是正确的,但这里有一件事你没有。

您可以注意到您的控制器收到GET,POST,PUT,DELETE等请求。这意味着您的.ajax方法应该指定您发送的请求的类型。

如果你想调用r_holidays控制器的destroy动作,你应该尝试这样的smth:

$.ajax("/r_holidays", type: 'DELETE', {holiday_id: sel.options[i].value, group_id: w_id}).done(function(data){});

希望这有帮助!

答案 2 :(得分:1)

$.ajax({
  url: "/r_holidays/w_destroy",
  dataType: 'html',
  data: {
      holiday_id: sel.options[i].value,
      group_id: w_id
    },
  })
  .done(function() {
    console.log("success");
  });

您需要传递要删除的记录的ID。然后它将从url调用方法,你可以在方法中找到你用$ .ajax传递数据的记录。

 url: "/r_holidays/:id/w_destroy"  I think you need to pass a Id here.

 var my_url = "/rholidays/" + <%= @object.id %> + "/w_destroy";
 pass my_url as url: my_url, in $.ajax  

你的方法应该包含。

 data = params[:holiday_id]
 group = params[:group_id]
 holiday = Holiday.find(data)
 holiday.destroy

这样你可以破坏方法。或rails提供了最佳的ajax方法(Rjs)。为什么不试试呢?

答案 3 :(得分:0)

Chowlett的答案对于GET和POST是正确的 - 用'get'/'post'替换'ajax'。或者通过传递设置对象https://api.jquery.com/jQuery.ajax/来使用完整的'ajax'语法。请注意,通过AJAX对PUT和DELETE方法的浏览器支持有一个可疑的历史记录,正如它在'type'设置的jQuery.ajax API文档中所述。

如果你的后端支持通过POST进行HTTP方法仿真,就像Rails一样,我已经用方便的$ .put,$ .patch和$ .delete方法编写了一个jQuery插件:

https://github.com/adjohnson916/jquery-methodOverride

看看吧!