1

我仍在尝试掌握 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 等)?

4

5 回答 5

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它应该可以帮助你更好地理解路由机制。

于 2012-07-13T00:53:18.840 回答
3

除了 wlad 所说的,您的 routes.rb 文件中的资源 :rsvps 东西创建了一组大多数模型都需要的默认路由。诸如索引、新建、创建或显示之类的东西。你的thank_you 动作没有出现在rake 路由中的原因是因为thank_you 不是一种非常常见的动作,它们需要在没有额外代码的情况下直接包含在内。

于 2012-07-13T03:21:35.630 回答
2

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

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

正如其他人在回答中所解释的那样,有多种方法可以做到这一点。

  • 添加更多宁静的动作

    使用membercollection里面resources

    member当您希望函数仅用于某些模型对象时使用。例如:照片 id 1 的预览
    GET /photos/:id/preview

    在我们的示例中,member如果您想要这样的路线和功能。

    获取 /rsvps/:id/thank_you

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

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

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

    获取 /rsvps/thank_you(.:format)

    在资源

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

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

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

您可以使用match. (这也需要在资源块中定义操作)。

match在这里查看更多信息http://guides.rubyonrails.org/routing.html#non-resourceful-routes

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

干杯。

于 2012-07-15T19:32:29.587 回答
2

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

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

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

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

于 2012-07-15T15:38:29.477 回答
0

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

resources :rsvps do  
  member get :thank_you
end

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

当您包含此内容并再次运行 rake 路由时,您将在那里看到新的 http 操作。

于 2012-07-13T05:53:52.210 回答