有没有办法创建一个名为`index`的Rails资源路由?

时间:2016-04-26 13:22:42

标签: ruby-on-rails ruby-on-rails-4 routes

我想将一个名为index的资源路由添加到Rails 4应用程序,但生成的路由不符合预期。但是,如果我使用其他名称(例如show_index),它们就是。为了演示,我将从一个没有路由的vanilla Rails应用程序开始:

$ rake routes
You don't have any routes defined!

我将以下内容添加到config/routes.rb

  resources :items

生成以下资源丰富的Rails路由:

   Prefix Verb   URI Pattern               Controller#Action
    items GET    /items(.:format)          items#index
          POST   /items(.:format)          items#create
 new_item GET    /items/new(.:format)      items#new
edit_item GET    /items/:id/edit(.:format) items#edit
     item GET    /items/:id(.:format)      items#show
          PATCH  /items/:id(.:format)      items#update
          PUT    /items/:id(.:format)      items#update
          DELETE /items/:id(.:format)      items#destroy

如果参数哈希包含show,则应用程序具有index操作,可以呈现所谓的{with: 'index'}(此索引是特定于应用程序的事情,而不是项目的集合或类似的东西。)

我添加了一个自定义index路由,以使用附加参数调用show操作:

  resources :items do
    get 'index' => 'items#show', with: 'index'
  end

这会产生一条新路线,但它有item_id而不是预期的id(与上面列表中的edit_item相比):

item_index GET    /items/:item_id/index(.:format) items#show {:with=>"index"}

:id Routing documentation获取on: :member的方法是使用get 'index' => 'items#show', with: 'index', on: :member ,因此路线需要

item

但这不会产生预期的结果。它会添加预期路线但会从默认show操作中窃取index_item方法前缀,而不是使用自己的edit_item(再次与上面列表中的item GET /items/:id/index(.:format) items#show {:with=>"index"} GET /items/:id(.:format) items#show 进行比较) :

index

但是,如果我使用show_index之外的其他内容,例如get 'show_index' => 'items#show', with: 'index', on: :member ,那么它会按预期工作:

show_index_item GET    /items/:id/show_index(.:format) items#show {:with=>"index"}

产生

index

因此,在调用路径resources时,行为会有所不同。我希望这是因为隐含的index路由使用该名称,尽管我认为它们不会以冲突的方式使用它。在我看来,我应该能够添加一条新的index_item路线,该路线将成为edit_item(类似于现有的item_index,与现有的index相反)。

我知道我可以通过使用不同的名称来解决这个问题。但show_index读取的内容优于index

所以我的问题是是否可以指定:id 关键的package com.example.android.buttons; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; public class Main2Activity extends AppCompatActivity { private static Button button_sbm1 , button_sbm2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); button_sbm1 = (Button) findViewById(R.id.button2); button_sbm2 = (Button) findViewById(R.id.button3); button_sbm1.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Intent intentMainActivity = new Intent(Main2Activity.this, MainActivity.class); startActivity(intentMainActivity); } }); button_sbm2.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Intent intentMain3Activity = new Intent(Main2Activity.this, Main3Activity.class); startActivity(intentMain3Activity); } } ); } 资源路径? `

1 个答案:

答案 0 :(得分:1)

要设置特定网址使用as关键字,请尝试以下操作:

get 'index' => 'items#show', with: 'index', on: :member, as: 'item_index'

或其中一个当然是你的愿望。