Rails:路由,控制器,视图,哦我的(感叹号)

Kev*_*own 2 methods ruby-on-rails

我对RoR场景有点新意见......我现在才开始连接点.在你的发展生涯中,你们能给我一些更明确的指导和指导吗?

我无法理解路由,控制器和视图之间的相关性(以及它们如何相互连接).

所以,我有我的控制器的index,show,new,create,destroy方法.和相应的

GET    /entries(.:format)                     entries#index
POST   /entries(.:format)                     entries#create
GET    /entries/new(.:format)                 entries#new
GET    /entries/:id/edit(.:format)            entries#edit
GET    /entries/:id(.:format)                 entries#show
PUT    /entries/:id(.:format)                 entries#update
DELETE /entries/:id(.:format)                 entries#destroy
Run Code Online (Sandbox Code Playgroud)

为什么我添加一个新方法,vote_up或者vote_down例如,以及具有匹配操作名称的视图,它不起作用.

1)添加新操作并将其连接到视图的正确方法是什么?2)奖金使这些方法与ajax兼容的正确方法是什么(用ajax渲染部分)?如果用户没有启用js会发生什么?

我可以根据我得到的答案扩展/发展这个问题.

我已经厌倦了谷歌搜索自定义动作路线等类似的东西来大杂烩我的应用程序.它正在流失和糟糕的形式,我终于达到理解语言的水平 - 我已经100%自学了...所以请尽量理解你是否可以为一个年轻的padawan.

And*_*rew 6

以下是从一开始就如何思考它:

1)您的应用程序所做的唯一事情是响应HTTP请求.

最典型的请求是:

  • GET - 用户在浏览器的URL栏中输入内容并点击输入.

  • POST - 用户提交表单.

还有其他类型的HTTP请求,最重要的是PUT,PATCH和DELETE.Rails遵循REST模式,这意味着它为这些HTTP谓词分配了特定的含义.

2)当任何请求进入您的应用程序时,它必须被路由到Controller Action.

您的routes.rb文件是Rails路由器(ActionDispatch)的一组指令,它告诉路由器将请求发送到何处."标准"rails资源是一个快捷方式,如下所示:

resources :things
Run Code Online (Sandbox Code Playgroud)

这意味着以下内容:

GET /things => things#index

GET /things/:id => things#show

GET /things/new => things#new

GET /things/edit/:id => things#edit

POST /things => things#create

PUT /things/:id => things#update

DELETE /things/:id => things#destroy
Run Code Online (Sandbox Code Playgroud)

这些被认为是标准的RESTful操作 - 您的resources :things声明不会设置任何其他操作.因此,如果您希望控制器执行其他非标准操作,则必须手动添加它们.

如果要对特定记录执行操作,最好的方法是使用:

resources :things do
  member do
    get 'vote_up'
  end
end
Run Code Online (Sandbox Code Playgroud)

这告诉路由器,如果有人发出GET请求/things/123/vote_up,它应该触发该ThingsController vote_up动作.

所有这些都在Rails指南中详细阐述,您应该阅读整个内容.

3)您的控制器的工作是发送对请求的响应.

通常,这意味着从数据库加载记录并呈现该记录的视图.

每个控制器操作都通过将响应发送回传入请求而结束.这个响应可以是一个render调用 - 这意味着以某种格式发回一些数据 - 或者一个redirect调用 - 它基本上会为你发出一个新的请求,因此你得到了另一个请求的响应.

在Rails中,重定向实际上是将请求发送到不同的控制器操作.

Render调用将数据作为对请求的响应发送.

当你调用时render :new,这是一个快捷方式render :template => :new,它加载app/views/things/new.html.erb(或任何)模板,从控制器发送数据(通常是你的实例变量),并使用模板语言(erb,haml等)对此进行评估.一大串HTML,然后控制器将其提供给浏览器.

想亲眼看看这是什么?尝试结束控制器render :text => 'Hello World',甚至:

render :inline => '<!DOCTYPE html><head><title>Inline Wow!</title></head><body>Mind blown.</body></html>'
Run Code Online (Sandbox Code Playgroud)

走着瞧吧.

在响应(呈现)时,您可以发送"普通"HTML模板,其中包含整页信息(头部,正文等),或者Ajax使用的部分信息.您还可以发送原始数据,如JSON或XML.它实际上只是文本,并且取决于该文本的内容(以及随其附带的HTTP标头),浏览器,脚本或客户端应用程序相应地处理它.

再次,请参阅Rails指南.

4)当浏览器发出请求时,您可能希望发回HTML.如果请求是由Ajax发出的,那么您可能想要发送回JSON.

对于自定义操作,vote_up您可能根本不想显示模板,只是重定向.所以,你可能有这样的事情:

ThingsController < ApplicationController

  def vote_up
    @thing = Thing.find(params[:id])
    @thing.vote_up
    redirect_to @thing
  end

end
Run Code Online (Sandbox Code Playgroud)

现在,路由器的一个好处是它将为您提供URL帮助程序.如果您已经创建了如前所示的路线和操作,则可以在"show thing"页面上找到如下URL:

link_to 'Vote up this thing!', vote_up_thing_path(@thing)
Run Code Online (Sandbox Code Playgroud)

这将创建一个链接things/123/vote_up,如果有人点击它,它将在该vote_up操作中运行代码ThingsController,然后重定向回show事件视图.

5)您的模板使用链接和表单向控制器发送消息.链接产生GET请求,表单发出POST请求.

如果你想开始有AJAX请求,那没关系.在这种情况下,您只需要在Javascript中发出请求,并处理响应.因此,举例来说,您可以在模板中添加以下内容:

= link_to 'Vote up this thing', vote_up_thing_path(@thing), :id => 'vote-up-button'
Run Code Online (Sandbox Code Playgroud)

然后在Javascript(使用jQuery)中你可以有这样的函数:

$(function(){
  $('a#vote-up-button').click( function(event){
    event.preventDefault();
    $.ajax({
      url: this.attr('href'),
      type: 'GET',
      success: function(){...},
      error: function(){...}
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

在这种情况下,jQuery Ajax方法只是发出一个get请求,然后根据它得到的响应运行一个回调函数.

6)控制器/路由的结构不会影响您可以进行的请求类型,只会响应什么操作将响应什么URL上的HTTP方法.

你做什么INSIDE你的控制器动作决定你是否准备好响应javascript或html请求等.

虽然rails肯定能够在单个控制器动作中处理多种请求格式,但是使用该respond_to块,作为一个实际问题,当您选择让路由仅响应一种或另一种格式时,我发现事情更加顺畅.

IE:我会让你的正常页面加载请求(索引,显示,新建,编辑)只是HTML请求,然后我会让你想要添加的任何其他AJAX操作只是Javascript - 即.他们用JSON而不是HTML回应.当然,你不必这样做,但如果你这样做,你的生活会更容易.

我希望这能让您更清楚地了解应用中发生的情况.欢迎来到Rails,您将加入一个伟大的社区!