Rails路由,如何正确指定此成员

时间:2013-05-09 19:27:20

标签: ruby-on-rails ruby

我目前有一些如下所示的路线:

  resources :contests do
    member do
      get :enter
    end
  end

这允许我对看起来像/ contests / 5 / enter的URL进行HTTP GET。现在,用户可以进入,填写一些表格,并能够提交参赛作品。所以我也希望能够发布到这个URL。我尝试了以下操作:

 resources :contests do
        member do
          get :enter
          post :enter
        end
      end

这发布到与我指定的GET成员相同的控制器#action,因此它不是很直观。如果可能的话,我希望能够将其指向单独的行动。这样做的最佳方法是什么?我目前正在使用Ruby on Rails 4 beta。

**更新**

我尝试了以下操作,但在启动服务器时出现了ArgumentError异常:

resources :contests do
    member do
      get :enter
      post :enter => "contests#create_entry"
    end
  end

3 个答案:

答案 0 :(得分:1)

您可以指定要指定路线的控制器/操作。

get :enter => "controller#get_enter"
post :enter => "controller#post_enter"

答案 1 :(得分:1)

您可以这样做:

resources :contests do
  member do
    get :enter
    post '/enter', to: "contests#create_entry", as: "create_entry"
  end
end

但是我同意Ola Tuvesson,你应该创建一个新的控制器和条目路由,即使你可能没有模型,类似于你经常有一个会话控制器登录和注销。像这样:

resources :contests do
  resources :entries, only: [:new, :create]
end

答案 2 :(得分:0)

我建议你把比赛的参赛作品作为比赛的儿童模特。这将为您提供条目上的所有CRUD方法,您的路线将只是:

resources :contests do
  resources :entries
end

/ contests / 5 / entries / new的GET将为您提供添加条目的表单,当此POST发送到/ contests / 5 /条目时,它将创建一个新条目。它还可以轻松列出竞赛等所有条目。您可以使用脚手架生成器轻松创建控制器,模型和相关视图,例如:

rails g scaffold Entry contest:references name:string email:string 

references列类型告诉生成器将竞赛与条目链接为一对多关系。任务完成。

修改:

如果您仍想重命名路线,请按以下方式进行操作:

http://guides.rubyonrails.org/routing.html#overriding-the-named-helpers

HTH