gpt4 book ai didi

ruby-on-rails - Rails:路线, Controller , View ,噢,我的感叹号

转载 作者:行者123 更新时间:2023-12-04 06:34:45 24 4
gpt4 key购买 nike

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

因此,我的控制器具有indexshownewcreatedestroy方法。和对应的

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


例如,如果我添加一个新方法 vote_upvote_down以及具有匹配操作名称的视图,怎么办却不起作用。

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

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

我已经厌倦了使用自定义动作路线栏杆之类的东西来搜索我的应用程序。这是排水和糟糕的形式,我终于可以理解这种术语了-我已经100%自学了...所以请尝试了解是否可以为年轻的巴达旺人。

最佳答案

从一开始,这就是它的思考方式:

1)您的应用唯一要做的一件事就是响应HTTP请求。

最典型的请求是:


GET-用户在浏览器的URL栏中输入内容,然后按Enter。
POST-用户提交表单。


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

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

您的routes.rb文件是Rails路由器(ActionDispatch)的一组指令,该指令告诉路由器将请求发送到哪里。 “标准” rails资源是作为快捷方式给出的,如下所示:

resources :things


这意味着:

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


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

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

resources :things do
member do
get 'vote_up'
end
end


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

所有这些都在 Rails Guide中详细说明,您应该阅读整个内容。

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>'


走着瞧吧。

响应(渲染)时,您可以发送“普通” HTML模板,其中包含整页的信息(头部,正文等),或Ajax使用的部分信息。您还可以发送原始数据,例如JSON或XML。实际上,它们全都是文本,并且根据文本的内容(以及随之而来的HTTP标头),浏览器,脚本或客户端应用程序会相应地对其进行处理。

同样,请参见 Rails Guide

4)当浏览器发出请求时,您可能希望发送回HTML。如果该请求是由Ajax发出的,则您可能希望发送回JSON。

对于 vote_up这样的自定义操作,您可能根本不想显示模板,而只是重定向。因此,您可能会有这样的事情:

ThingsController < ApplicationController

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

end


现在,路由器的好处之一是它将为您提供URL帮助程序。如果您已经如前所示创建了路线和动作,则在“显示内容”页面上可以有一个如下所示的URL:

link_to 'Vote up this thing!', vote_up_thing_path(@thing)


这将创建一个指向 things/123/vote_up的链接,如果有人单击它,它将在 vote_upThingsController操作中运行代码,然后重定向回显示视图。

5)您的模板使用链接和表单将消息发送到控制器。链接发出GET请求,表单发出POST请求。

如果您想开始收到AJAX请求,那很好。在这种情况下,您只需要用Javascript发出请求并处理响应即可。因此,例如,您可以在模板中放入以下内容:

= link_to 'Vote up this thing', vote_up_thing_path(@thing), :id => 'vote-up-button'


然后,在Javascript(使用jQuery)中,您可以具有以下功能:

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


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

6)控制器/路由的结构不会影响您可以发出的请求类型,只会影响对URL的HTTP方法做出何种响应。

您在控制器中执行的操作将确定您是否准备好响应javascript或html请求等。

尽管Rails当然可以使用 respond_to块在单个控制器动作中处理多种请求格式,但从实用性的角度来看,当您选择让路由仅响应一种格式或另一种格式时,我发现事情运行得更加顺利。

IE:我将使您的常规页面加载请求(索引,显示,新建,编辑)只是HTML请求,然后我将要添加的任何其他AJAX操作都仅是Javascript-即。他们使用JSON而不是HTML进行响应。当然,您不必这样做,但是如果这样做,您的生活将会更加轻松。

我希望这可以使您对应用程序中发生的事情有更清晰的认识。欢迎来到Rails,您正在加入一个伟大的社区!

关于ruby-on-rails - Rails:路线, Controller , View ,噢,我的感叹号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16115644/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com