试图在rails控制器中创建一个方法

时间:2012-07-13 00:40:47

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

我仍然试图摆脱rails并且我正在尝试使用一种形式创建一个简单的应用程序,我可以输入数据,然后提交它,它将存储在数据库中。我通过启动一个新项目然后运行来实现这一点非常简单:

$ rails generate scaffold RSVP firstName:string lastName:string

现在我想通过表格添加新记录后重定向到感谢页面。

我手动将以下方法添加到我的rsvps_controller.rb文件中:

# GET /rsvps/thank_you
  def thank_you
    respond_to do |format|
      format.html # thank_you.html.erb
      format.json { render json: @rsvps }
    end
  end

此行位于我的路线文件中:

resources :rsvps 

我的问题是,当我运行rake路线时,我没有看到我的thank_you方法的路线。不应该我的:rsvps资源接收我的thank_you路由以及路由如何知道哪个控制器方法是哪个http调用(get,post,put等)?

5 个答案:

答案 0 :(得分:6)

为了获得一个可以在你的控制器中执行该操作的路径,你应该在routes.rb文件中有类似的内容:

resources :rsvps do
  member { get :thank_you }
end

resources :rsvps do
  collection { get :thank_you }
end

这取决于您是否要访问刚刚创建的资源。

你可以看看@ http://guides.rubyonrails.org/routing.html它应该可以帮助你更好地理解路由机制。

答案 1 :(得分:3)

添加到wlad上说的资源:route.rb文件中的rsvps创建了一组大多数模型都需要的默认路由。索引,新建,创建或显示等内容。你的Thank_you行动没有出现在rake路线中的原因是因为thank_you不是那么常见的行动之一,它们需要在没有额外代码的情况下被包括在内。

答案 2 :(得分:2)

如果您需要在感谢页面上加载rsvp模型以显示该模型中的任何数据,那么您将需要使用成员路由。 :路由中的id将存在,因为这是资源成员路由,必须与特定资源相关联。网址中必须有一些内容才能知道要加载什么。

resources :rsvps do
  member { get :thank_you } #GET /rsvps/:id/thank_you(.:format)
end

如果您只想要一个指向该控制器操作的通用路由,那么您可以使用以下内容:

匹配“/ rsvps / thank_you”=> “rsvps#thank_you”,如:“rsvp_thank_you”

答案 3 :(得分:2)

您可以向任何控制器添加更多操作,但除非您在路径文件中指定,否则rails不会将此功能视为操作。它将被视为用户创建的控制器类中的另一个函数。

因此,如果您想将thank_you函数添加为操作,则需要将其添加到路径文件中。

有多种方式可以像其他人在答案中解释的那样。

  • adding-more-restful-actions

    member内使用collectionresources

    如果希望函数仅与某个模型对象一起使用,请使用member。 例如:预览照片id 1
    GET / photos /:id / preview

    在我们的示例中,如果您需要此类路由和功能,请member

    GET / rsvps /:id / thank_you

    注意:当您将其指定为成员操作时,需要使用params中的id。

    resources :rsvps do
      member do 
        get :thank_you  #GET /rsvps/:id/thank_you(.:format)
      end
    end
    

    如果您想直接调用此操作,请使用collection

    GET / rsvps / thank_you(。:格式)

    资源中的

    resources :rsvps do
      collection do 
          get :thank_you  #GET /rsvps/thank_you(.:format)
      end
    end
    

    您需要在将路线添加到路线时指定操作类型(GET | POST)。

    在我们的示例中,thank_you已被指定为GET操作。您可以选择。

您可以使用match创建自己的preety_urls或非宁静路线。 (这也需要在资源块中定义动作。)

点击match http://guides.rubyonrails.org/routing.html#non-resourceful-routes

了解详情

我建议你仔细阅读rails团队创建的这个很棒的文档。(再一次;))http://guides.rubyonrails.org/routing.html

干杯。

答案 4 :(得分:0)

正如您所说,您只想为每个rsvp显示一个感谢页面,因此应该使用成员路由。像这样

resources :rsvps do  
  member get :thank_you
end

当你想要显示所有或某些特定的thank_you集合时,你应该使用thank_you的集合。

当你包含它并再次运行rake路由时,你会在那里看到新的http动作。

相关问题