Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 铁路3条线路';匹配';语法_Ruby On Rails_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 铁路3条线路';匹配';语法

Ruby on rails 铁路3条线路';匹配';语法,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我想要一条路线 [PUT] http:// foo /data/base_states/?id=8 对于我的控制器,最好使用这种类型的定义: `match '/data/base_state:id' => 'base_state#create_or_update', via: [:put]` 怎么做 似乎有许多不同的方法来定义路线,但文档有所欠缺。也会对任何其他建议的语法(有效)感兴趣 不知道为什么建议的路由不起作用,这是我的routes.rb和controller config/r

我想要一条路线

[PUT] http:// foo /data/base_states/?id=8
对于我的控制器,最好使用这种类型的定义:

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

似乎有许多不同的方法来定义路线,但文档有所欠缺。也会对任何其他建议的语法(有效)感兴趣


不知道为什么建议的路由不起作用,这是我的routes.rb和controller

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
app/controllers/data/base\u states\u 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
示例呼叫

$.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

-->404

默认值:{format::json}
添加到您的路由中

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

希望我做这个还不算太晚

如果您的路由是
/data/base\u state/:id
,则用于查看id为8的匹配资源的url是
/data/base\u state/8.json


正如spas正确指出的那样,如果您在ajax调用中设置了正确的数据类型,
datatype:'json'
,那么您就不需要在URL的末尾添加.json,这也是我希望的工作方式。。。但事实并非如此。。我用full routes.rb和相关控制器更新了问题。这也是我期望的工作。。。但事实并非如此。。我用full routes.rb和相关控制器更新了问题。arg.尝试url“/data/base_state/8.json”@Slicedpan,它实际上可以工作:)!好极了。如果你回答,我就接受。。。如果没有.json,我如何让它响应呢?您缺少ajax调用的数据类型:
dataType:'json'
,那么您就不必在url的末尾写入
.json
match '/data/base_state:id' => 'base_state#create_or_update', via: [:put], defaults: {format: :json}
put '/data/base_state:id' => 'base_state#create_or_update', defaults: { format: :json }
put "data/base_state:id(.:format)" => 'base_state#create_or_update'