1

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

  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
4

3 回答 3

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
于 2013-05-09T22:00:19.343 回答
1

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

get :enter => "controller#get_enter"
post :enter => "controller#post_enter"
于 2013-05-09T19:29:32.017 回答
0

我建议您将竞赛的参赛作品设为竞赛的儿童模型。这将为您提供有关条目的所有 CRUD 方法,您的路线将只是:

resources :contests do
  resources :entries
end

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

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

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

编辑:

如果您仍想重命名路线,方法如下:

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

高温高压

于 2013-05-09T19:54:33.933 回答