Ruby on rails 尝试在rails控制器中创建方法

Ruby on rails 尝试在rails控制器中创建方法,ruby-on-rails,ruby,ruby-on-rails-3,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_

我仍在尝试了解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路由时,我没有看到我的感谢方法的路由。我的:rsvps资源不应该选择我的感谢路由吗?路由如何知道哪些控制器方法是哪些http调用(get、post、put等)?

为了获得一条将在控制器中执行该操作的路由,您应该在routes.rb文件中包含如下内容:

resources :rsvps do
  member { get :thank_you }
end

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


你可以看看@它应该可以帮助你更好地理解路由机制

为了在控制器中获得一个将命中该操作的路由,您应该在routes.rb文件中包含如下内容:

resources :rsvps do
  member { get :thank_you }
end

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


你可以看看@它应该可以帮助你更好地理解路由机制

再加上wlad所说的,routes.rb文件中的参考资料:rsvps things创建了一组大多数模型都需要的默认路由。例如索引、新建、创建或显示。感谢你的行为没有出现在rake routes中的原因是感谢你并不是一种非常常见的行为,它们需要在没有额外代码的情况下开箱即用。

补充wlad所说的内容,参考资料:routes.rb文件中的rsvps things创建了一组大多数模型都需要的默认路由。例如索引、新建、创建或显示。“谢谢你”操作没有出现在rake routes中的原因是“谢谢你”并不是一种非常常见的操作,它们需要在没有额外代码的情况下开箱即用。

正如您所说,您只想为每个rsvp显示一个“谢谢你”页面,以便使用成员路由。像这样

resources :rsvps do  
  member get :thank_you
end
当您想要显示所有或某些特定的感谢集合时,应该使用“感谢集合”


当您包括这个并再次运行rake路由时,您将在那里看到新的http操作

正如您所说,您只需要为每个rsvp显示一个感谢页面,这样就可以使用会员路线。像这样

resources :rsvps do  
  member get :thank_you
end
当您想要显示所有或某些特定的感谢集合时,应该使用“感谢集合”


当您包括这个并再次运行rake路由时,您将在那里看到新的http操作

如果需要在感谢页面上加载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”

如果需要在thank you页面上加载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”

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

因此,如果要将“谢谢”功能添加为“操作”,则需要将其添加到路由文件中

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

  • 资源中使用
    成员
    集合

    当您希望函数仅用于某个模型对象时,请使用
    member
    。 例如:照片id 1的预览
    获取/照片/:id/预览

    在我们的示例中,如果您想要这样的路由和功能,您可以选择
    成员

    GET/rsvps/:id/谢谢

    注意:将参数指定为成员操作时,需要参数中的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_已将您指定为GET操作。你可以选择其中之一

您可以使用
match
创建自己的preety\u URL或非restful路由。 (这还需要在参考资料块中定义操作)

在这里查看有关匹配的更多信息

我建议您阅读一下rails团队创建的这篇很棒的文档


干杯。

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

因此,如果要将“谢谢”功能添加为“操作”,则需要将其添加到路由文件中

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

  • 资源中使用
    成员
    集合

    使用
    成员