2014-03-31 2 views
1

내 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(...)에서 실수가 있어야합니다.

누구나 아이디어를 얻을 수 있습니까?

여기 내 컨트롤러 코드입니다 :

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 

그리고 관련 라인 (들) 내하는 Pathes를 검토 , 나는

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 

편집 ... 내가 나열되지 않습니다 실현 rb는 단지 resources :r_holidays

+0

우리는 컨트롤러 코드와 routes.rb의 관련 부분을 볼 수 있습니까? – akatakritos

+0

경로 파일에 w_destroy 액션을 추가 했습니까? –

+0

나는 그렇지 않았다. 어디에서 추가해야합니까? 방금 ​​route.rb에 r_holidays라는 리소스를 추가했습니다. 그 밖의 무엇을 추가해야합니까? – user3383458

답변

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 

이렇게하면 방법을 파괴 할 수 있습니다. 또는 레일은 최고의 아약스 방법 (Rjs)을 제공합니다. 왜 그걸 시도하지 않니?

2

$.ajax과 함께 $.get 구문을 사용하고 있다고 생각합니다.

$.ajax$.get으로 바꿔보십시오.

+0

감사합니다! 노력했지만 작동하지 않습니다. 테이블의 행을 생성/삭제하기 위해이 작업을 수행하려고합니다. 그러나 그것은 효과가 없습니다. – user3383458

+1

아. GET 경로 또는 POST/PUT/DELETE만으로 작업에 액세스 할 수 있습니까? – Chowlett

+0

$ .get은'DELETE' 메쏘드 – engineersmnky

1

코드가 올바르지 만 여기서 누락 된 것이 하나 있습니다.

컨트롤러가 GET, POST, PUT, DELETE와 같은 요청을 수신하는 것을 볼 수 있습니다. 즉, .ajax 메소드가 보내는 요청 유형을 지정해야합니다. 이 도움이

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

희망 :

당신이 이런 식으로 떨어지게을 시도해야 당신의 r_holidays 컨트롤러의 동작을 파괴 호출하려면

!

+0

으로 호출해야하는'r_holidays # show' 경로로가는 길을 따라갈 것이고,이 줄을 추가 할 때 'DELETE'때문에 구문 오류가 발생합니다. 이게 정상인가? – user3383458

0

Chowlett의 답변은 GET 및 POST에 적합합니다. 'ajax'를 'get'/ 'post'로 바꿉니다. 또는 설정 객체 인 https://api.jquery.com/jQuery.ajax/을 전달하여 전체 'ajax'구문을 사용하십시오. AJAX를 통한 PUT 및 DELETE 메소드에 대한 브라우저 지원은 'type'설정에 대한 jQuery.ajax API 문서에서 말한 것처럼 의심스러운 역사가 있습니다. 백엔드가 POST를 통해 HTTP 방식 에뮬레이션을 지원하는 경우

는 레일하는 것처럼, 나는 편리한 $의 .put, $의 .patch라는와 그에 대한 jQuery 플러그인을 작성했으며, $ .delete 방법 :

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

그것을 확인하십시오!

관련 문제