2013-11-20 71 views
0

我想航線Rails的3條路線 '匹配' 語法

[PUT] http:// foo /data/base_states/?id=8 

到我的控制器,最好用這種風格的定義:

`match '/data/base_state:id' => 'base_state#create_or_update', via: [:put]` 

如何?

似乎有許多不同的方式來定義路線,文檔有所欠缺。會對任何其他建議的語法(即有效)感興趣。


不知道爲什麼建議的路線不工作,這是我的routes.rb和控制器......

的config/routes.rb中

EntwineBe::Application.routes.draw do 

    namespace :data, defaults: {format: :json} do 
     resources :event_categories 
     resources :state_categories 
     resources :base_events 
     resources :base_states 

     match '/block/:bock' => 'block#show', via: [:get] # curiously, this WORKS AS EXPECTED with GET http://foo/data/block/foo 

     match '/base_state/:id' => 'base_states#create_or_update', via: [:put] 
    end 
end 

應用程序/ controllers/data/base_states_controller.rb

class Data::BaseStatesController < ApplicationController 
    before_action :set_base_state, only: [:show, :edit, :update, :destroy] 

    def index 
    @base_states = BaseState.all 
    end 

    def show 
    end 

    def new 
    @base_state = BaseState.new 
    end 

    def edit 
    end 

    def create # typical REST is that this is PUT 
    @base_state = BaseState.new(base_state_params) 

    respond_to do |format| 
     if @base_state.save 
     format.html { redirect_to @base_state, notice: 'Base state was successfully created.' } 
     format.json { render action: 'show', status: :created, location: data_base_state_url(@base_state) } 
     else 
     format.html { render action: 'new' } 
     format.json { render json: @base_state.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def create_or_update 
    logger.info "WTF" 
    end 

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

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_base_state 
     @base_state = BaseState.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def base_state_params 
     params.require(:base_state).permit(:foo, :bar) 
    end 
end 
> 404 -

'耙路線'

  data GET /data/block/:block(.:format)   data/code_block#show {:format=>:json} 
       PUT /data/base_state/:id(.:format)   data/base_states#create_or_update {:format=>:json} 
       PUT /data/base_state:id(.:format)    base_state#create_or_update {:format=>:json} 

例如呼叫

$.ajax({'type':'PUT', 'url':'/data/base_state?id=8'}) 
$.ajax({'type':'PUT', 'url':'/data/base_state/?id=8'}) 

$.ajax({'type':'PUT', 'url':'/data/base_state?id=8.json'}) // not that expect it to need/I want to have .json 
$.ajax({'type':'PUT', 'url':'/data/base_state/?id=8.json'}) // not that expect it to need/I want to have .json 

的相關輸出!

+0

嘗試的URL「/數據/ base_state的末尾添加以.json /8.json' – Slicedpan

+0

@Slicedpan實際上工作:)!甜。如果你回答我會接受。 ...我怎麼能得到它沒有.json迴應,但? – Purrell

+1

你缺少的Ajax調用的數據類型:'數據類型:「json''那麼你不必在URL的末尾寫'.json'。 – spas

回答

0

添加defaults: {format: :json}到您的路線。

match '/data/base_state:id' => 'base_state#create_or_update', via: [:put], defaults: {format: :json} 
+0

這就是我期望的工作......但它不..我用完整的routes.rb和控制器更新了問題。 ARG。 – Purrell

0
put '/data/base_state:id' => 'base_state#create_or_update', defaults: { format: :json } 
+0

這就是我期望的工作......但它不..我用完整的routes.rb和控制器更新了問題。 ARG。 – Purrell

0
put "data/base_state:id(.:format)" => 'base_state#create_or_update' 
0

希望我沒有這個爲時已晚!

如果您的路線是/data/base_state/:id,那麼您用於查看ID爲8的匹配資源的網址爲/data/base_state/8.json

由於溫泉正確地指出,如果在Ajax調用,dataType: 'json'設置正確的數據類型,那麼你就需要在URL