如何使用新操作的参数声明rails资源?

Ant*_*ine 11 routes ruby-on-rails

我有一个名为Entree的模型,其中newaction需要一个参数,另一个名为Cave的模型的id .我不想在洞穴中嵌入Entree,因为Cave已经嵌套了.
我所做的是将资源Entree声明如下routes.rb:

resources :entrees, :except => [:new]
match "/entrees/new/:id", :to => "Entrees#new", :as => 'new_entree'
Run Code Online (Sandbox Code Playgroud)

这是有效的,但问题是当操作中出现错误时create,我想再次使用无效输入显示页面.但由于没有new动作,我必须做一个redirect_to new_entree_path,这不会保留用户输入.

我尝试过以下(最简单)的路线:

resources :entrees
Run Code Online (Sandbox Code Playgroud)

但是然后路径http://localhost:3000/entrees/new/32返回一个错误:

No route matches [GET] "/entrees/new/32"

问题是,如何在路径文件中使用new操作参数声明Entree资源?

Ant*_*ine 20

我不确定这是不是黑客,但以下工作,似乎比2级嵌套更清晰.

resources :entrees, :except => [:new] do
  collection do
    get 'new/:id', :to => "entrees#new", :as => 'new'
  end
end
Run Code Online (Sandbox Code Playgroud)

现在我可以做一个render "new"而不是一个redirect_to.我必须说我一定是错误地问了我的问题,不好.


sbo*_*ami 13

Rails有一个路由助手调用path_names,它执行此操作:

resources :entrees, path_names: { new: 'new/:id' }
Run Code Online (Sandbox Code Playgroud)


小智 5

为了改善gwik的解决方案(实际上对我不起作用):

resources :things, except: [:new] do
  new do
    get ':param', to: 'things#new', as: ''
  end
end
Run Code Online (Sandbox Code Playgroud)

它可以免费获得new_thing_*助手(而不是new_things_*).