我仍然试图摆脱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等)?
答案 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函数添加为操作,则需要将其添加到路径文件中。
有多种方式可以像其他人在答案中解释的那样。
在member
内使用collection
和resources
。
如果希望函数仅与某个模型对象一起使用,请使用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动作。