我是Rails3的新手,我基本上创建了一个subscribers脚手架,我只希望我的应用程序响应new和create操作.
所以config/routes.rb我定义:
resources :subscribers, :only => [:new, :create]
哪种方式有效
GET /subscribers => subscribers#new POST /subscribers => subscribers#create
现在我希望我的应用程序在/(root)上展示订阅者资源而不是/subscribers,所以这就是我所做的:
match '/' => "subscribers#new" match '/' => "subscribers#create" match '/' => "subscribers#thankyou" resources :subscribers, :only => [:new, :create]
哪种方式有效,但可能不是最糟糕的事情:这里有我遇到的问题:
/subscribersURL而不是just /,表单是使用form_for(@subscriber)辅助方法创建的,因此path帮助程序必须以某种方式不受路由影响/subscribers/,然后在连接回来时进行刷新(浏览器要求重新提交=> OK)时,Rails应用程序崩溃(我没有错误堆栈,但是这是生产),为什么?此外,我尝试以这种方式设置路线:
resources :subscribers, :only => [:new, :create] do
collection do
post '/' => :create
get '/' … 我有一些像这样的命名路线rake routes:
birthdays GET /birthdays(.:format) birthdays#index
Run Code Online (Sandbox Code Playgroud)
在rakefile中,我只是希望能够birthdays_url在我的视图中调用.
task :import_birthdays => :environment do
url = birthdays_url
end
Run Code Online (Sandbox Code Playgroud)
但是我收到了一个错误 undefined local variable or method 'birthdays_url' for main:Object
我很好奇人们认为对路线进行充分/彻底的测试.我工作的人似乎想要在我们的路线文件中断言每条路线,无论标准如何.我觉得这是浪费时间,但也许我错了,我不知道这有什么价值.
在某些情况下,我可以在路由中看到一些价值.我们仍然有一些响应GET和POST请求的动作,虽然我一直想要摆脱它们.我们没有任何关于lambdas或任何东西的疯狂约束,但是如果我们这样做,那似乎值得测试.
但对于正常的资源定义?
resources :foo, only: [:index, :show]
Run Code Online (Sandbox Code Playgroud)
我们断言这两条路线都存在,我们声称它们是GET并且它们会转到正确的控制器/动作.这有什么意义吗?感觉就像我们刚刚测试Rails一样.
在一个稍微相关的问题上,我更喜欢定义像上面那样的资源路径(包括only: [:index, :show]部分).resources :foo如果在该控制器上只有索引/显示操作,那么仅在路由文件中定义是否有任何后果?
在我看来,它可能只是使用更多的时间和/或内存,但它是否也是一个安全问题,或者是我不知道的非常糟糕的事情?
我正在浏览rubyonrails.org的"博客教程",当我尝试提交"帖子"时出现此错误:路由错误 - 没有路由匹配[POST]"/ posts/new"
我将教程中的代码复制并粘贴到我的代码中.这应该返回带有帖子的文本和标题的哈希值,但是我得到了上面的错误.
这是我的观点:
<%= form_for :post, url: posts_path do |f| %>
<p>
<%= f.label :title %><br>
<%= f.text_field :title %>
</p>
<p>
<%= f.label :text %><br>
<%= f.text_area :text %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
Run Code Online (Sandbox Code Playgroud)
这是我的控制器:
class PostsController < ApplicationController
def new
end
def create
render text: params[:post].inspect
end
end
Run Code Online (Sandbox Code Playgroud)
这是我的routes.rb:
Blog::Application.routes.draw do
resources :posts
end
Run Code Online (Sandbox Code Playgroud)
rake路线给出了:
posts GET /posts(.:format) posts#index
POST /posts(.:format) posts#create
new_post GET /posts/new(.:format) posts#new
edit_post GET /posts/:id/edit(.:format) posts#edit
post …Run Code Online (Sandbox Code Playgroud) 在RoR 3中,我只想拥有一个链接/按钮来激活控制器中的某些操作/方法.具体来说,如果我点击页面上的"update_specs"链接,它应该转到我的产品控制器中的"update_specs"方法.我在这个网站上找到了建议:
link_to "Update Specs", :controller => :products, :action => :update_specs
Run Code Online (Sandbox Code Playgroud)
但是,当我点击此链接时,我收到以下路由错误:
路由错误没有路由匹配{:action =>"update_specs",:controller =>"products"}
我已经阅读了路由但我不明白为什么如果可以通过资源访问所有其他方法,我必须路由此方法:产品.
model-view-controller controller ruby-on-rails rails-routing
我to_param在Category模型中覆盖了方法
def to_param
name
end
Run Code Online (Sandbox Code Playgroud)
和 routes.rb
get '/:id' => 'categories#show', :as => :category
Run Code Online (Sandbox Code Playgroud)
当name参数不包含任何点(foobar)时,一切正常,但是当它(f.o.o.b.a.r)时,我得到一个错误No route matches [GET].所以我的问题是:是否可以在路由中使用点作为参数名称的一部分?或者我可以做些什么来完成这个目的,也许是一些钩子或什么的.任何帮助表示赞赏.
我正在使用Rails 3和Devise创建一个应用程序,用户可以访问该网站并显示包含登录和注册表单的主页.这个页面有自己的控制器("主页"),所以它的路线是
root :to => "homepage#index"
Run Code Online (Sandbox Code Playgroud)
如果用户已经登录,我想显示不同的主页.这将考虑到根点
root :to => "dashboard#index"
Run Code Online (Sandbox Code Playgroud)
有没有办法在routes.rb中设置条件路由,这样我就可以在将用户路由到其中一个主页之前检查用户是否经过身份验证?
我尝试使用以下代码,但如果我没有登录,设计要求我登录,所以显然只有第一条路线有效.
authenticate :user do
root :to => "dashboard#index"
end
root :to => "homepage#index"
Run Code Online (Sandbox Code Playgroud)
此外,我希望网址在两种情况下都指向www.example.com,以便www.example.com/dashboard/index和www.example.com/homepage/index永远不会出现在浏览器中.
太感谢了 !!!
我有2个控制器:
app/
/controllers
posts_controllers.rb
/mobile
posts_controllers.rb
Run Code Online (Sandbox Code Playgroud)
和我的routes.rb看起来像这样:
root :to => "posts#index"
resources :posts
namespace :mobile do
root :to => "posts#index"
resources :posts
end
Run Code Online (Sandbox Code Playgroud)
但是当我访问时/mobile,无论如何渲染第一个控制器的索引页面,也尝试了这个:
namespace :mobile do
root :to => "mobile/posts#index"
resources :posts
end
Run Code Online (Sandbox Code Playgroud)
但它给了我错误:uninitialized constant Mobile::Mobile
我想渲染第二个控制器的索引页面,我该怎么做?
编辑
通过输入/ mobile我想渲染位于此处的文件:
app/
views/
/mobile
/posts
index.html.erb
Run Code Online (Sandbox Code Playgroud)
但它在这里是rending文件:
app/
views/
/posts
index.html.erb
Run Code Online (Sandbox Code Playgroud) 在Rails 3.2.11中,我有以下路由定义
resources :foos do
resources :bars
resources :bangs, :controller => 'foos/bangs'
end
Run Code Online (Sandbox Code Playgroud)
这导致以下路线
foo_bars GET /foos/:foo_id/bars(.:format) bars#index
POST /foos/:foo_id/bars(.:format) bars#create
new_foo_bar GET /foos/:foo_id/bars/new(.:format) bars#new
edit_foo_bar GET /foos/:foo_id/bars/:id/edit(.:format) bars#edit
foo_bar GET /foos/:foo_id/bars/:id(.:format) bars#show
PUT /foos/:foo_id/bars/:id(.:format) bars#update
DELETE /foos/:foo_id/bars/:id(.:format) bars#destroy
foo_bangs GET /foos/:foo_id/bangs(.:format) foos/bangs#index
POST /foos/:foo_id/bangs(.:format) foos/bangs#create
new_foo_bang GET /foos/:foo_id/bangs/new(.:format) foos/bangs#new
edit_foo_bang GET /foos/:foo_id/bangs/:id/edit(.:format) foos/bangs#edit
foo_bang GET /foos/:foo_id/bangs/:id(.:format) foos/bangs#show
PUT /foos/:foo_id/bangs/:id(.:format) foos/bangs#update
DELETE /foos/:foo_id/bangs/:id(.:format) foos/bangs#destroy
foos GET /foos(.:format) foos#index
POST /foos(.:format) foos#create
new_foo GET /foos/new(.:format) foos#new
edit_foo GET /foos/:id/edit(.:format) foos#edit
foo …Run Code Online (Sandbox Code Playgroud) controllers rails-routing nested-resources ruby-on-rails-3.2
我需要将以下成员方法添加到许多资源中,有没有办法干掉它?
member do
get :votes
post :up_vote
post :down_vote
end
Run Code Online (Sandbox Code Playgroud)
在我的routes.rb
resources :news do
resources :comments do
member do
get :votes
post :up_vote
post :down_vote
end
end
end
resources :downloads do
resources :whatever do
member do
get :votes
post :up_vote
post :down_vote
end
end
end
Run Code Online (Sandbox Code Playgroud)
编辑
我实际上把它移到了一个像这样的模块中:
module Votable
module RoutingMethods
def votable_resources
member do
get "up_votes"
get "down_votes"
post "up_vote"
post "down_vote"
end
end
end # RoutingMethods
end
Run Code Online (Sandbox Code Playgroud)
现在,我的routes.rb看起来像这样:
require 'votable'
include Votable::RoutingMethods
MyApp::Application.routes.draw do
namespace :main, :path => …Run Code Online (Sandbox Code Playgroud)