如何在Rails控制器中使用自定义操作,由嵌套路由调用

时间:2012-12-22 08:54:05

标签: ruby-on-rails-3 ruby-on-rails-3.1

我想在同一个控制器中添加一个名为“campaign”的自定义动作,就像REST的“new”一样,但它的目的是不同的,所以我想将它们分开。因为,此广告系列表单将包含一些其他字段。另一种选择是将额外参数传递给“新”操作,并为常规“新”操作和自定义“广告系列”呈现不同的模板。但是,我想弄清楚为什么它没有成功。

所以,我想出了以下路线(“消息”是控制器同时具有“新”和“广告系列”操作):

get 'users/:user_id/messages/campaign', as: :campaign_user_message

resources :users do
   resources: messages do
      member do
        get 'campaign'
      end
   end
end

在控制台输出中,我收到了ActiverRecord:RecordNotFound,因为它执行此操作:

Started GET "/users/1/messages/campaign" for 127.0.0.1 at 2012-12-22 00:14:38 -0800
Processing by MessagesController#show as HTML
Parameters: {"user_id"=>"1", "id"=>"campaign"}

我正在用这种方式调用这个动作:

link_to campaign_user_message_path(@user)

2 个答案:

答案 0 :(得分:1)

如果您想拥有诸如“/ users / 1 / messages / campaign”之类的路线,您应该像这样写一下:

resources :users do
 resources :messages do
    collection do
      get 'campaign'
    end
 end
end

如果您按照自己的方式编写(成员执行...结束),您的代码将生成网址“/ users /:user_id / messages /:id / campaign”。你应该传递@user和@message:

link_to campaign_user_message_path(@user, @message)

答案 1 :(得分:0)

我已经做了类似的事情克服了上述问题:

resources :users do
    get 'messages/new_campaign' => 'messages#new_campaign'
    post 'messages/create_campaign' => 'messages#create_campaign'
end

所以,我可以使用url helper“user_messages_new_campaign”来获取动作/ users /:user_id / messages / new_campaign“