新手问题 求教一个关于 redirect 和路由的问题

neo · 2013年08月01日 · 最后由 shatle 回复于 2013年08月07日 · 2928 次阅读

EventsController 中 def create
@event = Event.new(params[:event]) if @event.save redirect_to :action => :index
else render :action => :new end end

new.html.erb 中 <%= form_for @event, :url => { :controller => 'events', :action => 'create'} do |f| %> <%= render :partial => 'form', :locals => {:f => f} %> <%= f.submit "Create" %> <% end %> 我在 create 方法中调用了 redirect,但是当我在提交表单时它为什么还是报路由错误 No route matches [POST] "/events/create"

在路由表中添加 resources :events 删除其他的 match

#1 楼 @kai1248 这样解决了,谢谢。能和我解释下为什么么?谢谢

resources 用来实现 REST api 你的 events 应该是个 REST 资源

对于每一个资源,rails 都会有 7 个标准的 path 方法 index,new,show,update,destroy,create,edit

我解释不好,理论比较差,等大牛解答。

@neo 我觉得你应该从框架上理解:

rails 基本框架是这样子构成的:R -- MVC -- DB

R: route,路由。控制访问,也就是你控制浏览器或者其他 HTTP 端以什么样的网址来访问你的服务端。

MVC: model(模型), view(视图), controller(控制器)。 模型是数据构成对实物的抽象,其中还连接着数据库 (DB);视图可以理解为你看到的页面;控制器,就是主要的业务逻辑。 controller 通过 model 得到数据库的数据,并进行操作 (如 def create,新建操作),然后反应到 view 中。虽然 controller 进行了某些操作,但是你在浏览器上还是不能通过访问网址,从而执行这些操作。因为,还要通过 route。 简单来说,route 是一夫当关中的那个,关内的东西做得再好,要出去,首先要到我这来签证;外面的东西再 NB,不按照签证上的航班路线(可以理解为网址)来的话,只能看到关着的门。

DB:数据库。不想多说,存储数据的地方。

从而框架简单地又可以划为:CV -- R -- SV -- C -- M -- DB。V 在此处分为 CV(client view)和 SV(server view)。CV 和 SV 可以当成是一样的。


resources :events只是 route 的一种签证方式而已,还可以有其他方式。

#4 楼 @shatle 受教了,谢谢~~其实我之前采用的不是 RESTful 的路由方法,采用传统路由,不知道为什么会说我路由错误啊。。。

@neo 请合理理解 REST,其主要方法无非是通过路径和访问方式可以操作资源。其实在开发中,主要业务逻辑,还是要根据实际情况来做的,没必要一路走极端。

路由错误主要原因:1,语法错误;2,没有指定 action,路由不知道执行哪部分代码;3,同一路径在路由定义中有歧义,即多处路由定义中都可接收此路径;

如果利用其它 gem,请参照其说明。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号