标签: rails-routing

如何根据rails中的提交按钮触发不同的操作

我有一个包含内容列表的表单,以及已经到位的更新项目的操作。

我想要另一个按钮,单击该按钮会触发不同的操作以删除所选项目。

  = form_for @new_item,:url => {:controller => "item_lists",:action => "update_list" } do |f|
     - @items.each do |it|
    %input{:type=>"hidden",:name=>"item_list[#{it.id}]position",:value=>it.position, :class=>'position'}
    %textarea{:name=>"item_list[#{it.id}]field1"}
      =it.field1
    %textarea{:name=>"item_list[#{it.id}]field2"}
      =it.field2
    %input{:type=>'checkbox', :name=>'selected_items[]', :value=>it.id}
    =(it.valid?) ? "" : it.errors.full_messages




    %input{:type=>"submit", :value=>"Save changes", :name=>'save'}
    %input{:type=>"submit", :value=>"Remove selected", :name=>'delete'}
Run Code Online (Sandbox Code Playgroud)

这个问题似乎表明我应该检查我的操作中的参数以找出单击的内容。但这感觉很混乱,当我添加更多操作时,我的控制器可能很快就会退化为大量的 if。

有没有更优雅的方法来做到这一点,即让它只路由到正确的方法?

谢谢你的帮助...

model-view-controller ruby-on-rails rails-routing

5
推荐指数
1
解决办法
4578
查看次数

Rails 4:如何实现多对多关系的路由?

在我们的 Rails 4 应用程序中,有四种模型:

class User < ActiveRecord::Base
  has_many :administrations, dependent: :destroy
  has_many :calendars, through: :administrations
end

class Administration < ActiveRecord::Base
  belongs_to :user
  belongs_to :calendar
end

class Calendar < ActiveRecord::Base
  has_many :administrations, dependent: :destroy
  has_many :users, through: :administrations
end

class Post < ActiveRecord::Base
    belongs_to :calendar
end
Run Code Online (Sandbox Code Playgroud)

以下是相应的迁移:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :first_name
      t.string :last_name
      t.string :email
      t.integer :total_calendar_count
      t.integer :owned_calendar_count

      t.timestamps null: false
    end
  end
end

class CreateAdministrations < ActiveRecord::Migration
  def change
    create_table …
Run Code Online (Sandbox Code Playgroud)

routes ruby-on-rails rails-routing ruby-on-rails-4

5
推荐指数
1
解决办法
2599
查看次数

无法在 Rails 中创建具有带前导点的段的路由(以验证 Let's Encrypt)

在 Heroku 上的 Rails 5 应用程序中,我正在尝试为此 URL 创建路由:http://beta.example.com/.well-known/acme-challenge/some-key,以便我可以验证我的服务器让我们加密以获取 SSL 证书。但是我无法让路线在路线的任何部分使用前导点或句点,它只返回 404 Not Found。

换句话说,开头的点是把.well-known事情搞砸了。我可以得到一条没有点的工作路线,或者如果点在其他地方(例如well.known),但如果点是段中的第一个字符,则它不起作用。

我从这个开始:

get "/.well-known/acme-challenge/:id" => "pages#letsencrypt"
Run Code Online (Sandbox Code Playgroud)

当那不起作用时,我尝试使用(动态段):

get ':letsencrypt_route/acme-challenge/:id', to: "pages#letsencrypt", letsencrypt_route: /[^\/]+/
Run Code Online (Sandbox Code Playgroud)

这将允许在段中的任何地方都有一个点......除了第一个字符,这是我需要的地方。

知道是什么原因造成的吗?当我尝试导航到在一个段中有一个前导点的 URL 时,它甚至没有在我的日志中显示任何内容,它只是一个直接的 404。

我已经看到有些人在 Rails 4 和 Rails 5 上都有这个问题,我使用 Thin 或 Puma,在开发和生产中都发生了这个问题。我也试过使用几个letsencrypt gem,但它在同一点上停滞不前。

这是我的 Gemfile,其中包含两种环境中的 gem:

source "https://rubygems.org"

ruby "2.3.1"

gem "rails", "5.0.0.1"

gem "pg", "0.18.4" # postgresql database
gem "twitter-bootstrap-rails", "~> 3.2.2"

gem "active_median", "~> 0.1.0" # used with chartkick for graph …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails heroku rails-routing lets-encrypt

5
推荐指数
1
解决办法
840
查看次数

如何解决这些冲突的Rails路由?

我的routes.rb中有一个条目,如下所示:

resources :baskets, :shallow => true, :only => :show
  resource :owned, :only => [:create, :destroy]
end

get '/baskets/owned', :to => 'owners#index'
Run Code Online (Sandbox Code Playgroud)

这会创建如下所示的路线:

basket        GET    /baskets/:id(.:format)
baskets_owned GET    /baskets/owned(.:format)
# ...
Run Code Online (Sandbox Code Playgroud)

但现在,当我打电话/篮子/拥有时,我得到了这个:

Started GET "/baskets/owned" for 10.0.1.2 at 2011-06-09 10:31:33 -0400
  Processing by BasketsController#show as JSON
  Parameters: {"id"=>"owned"}
Run Code Online (Sandbox Code Playgroud)

解决此路由冲突的最惯用方法是什么?

rails-routing ruby-on-rails-3

4
推荐指数
1
解决办法
1472
查看次数

路由测试失败:NoMethodError:"///"的未定义方法`values':String

我得到了一个失败的测试,我调试很困难.

我的测试用例是:

it "routes to #active" do
  get ("/parties/active").should route_to("parties#active")
end
Run Code Online (Sandbox Code Playgroud)

我的路线是:

resources :parties do
  get 'active', :on => :collection
end
Run Code Online (Sandbox Code Playgroud)

当我运行测试用例时,我收到以下错误:

NoMethodError: undefined method `values' for "/parties/active":String
Run Code Online (Sandbox Code Playgroud)

完整错误输出:https://gist.github.com/1748264

当我运行rake路线时,我看到:

active_parties GET    /parties/active(.:format)   parties#active
       parties GET    /parties(.:format)          parties#index
               POST   /parties(.:format)          parties#create
     new_party GET    /parties/new(.:format)      parties#new
    edit_party GET    /parties/:id/edit(.:format) parties#edit
         party GET    /parties/:id(.:format)      parties#show
               PUT    /parties/:id(.:format)      parties#update
               DELETE /parties/:id(.:format)      parties#destroy
          root        /                           parties#show
Run Code Online (Sandbox Code Playgroud)

我正在运行的测试几乎与脚手架生成的测试相同:

it "routes to #new" do
  get("/parties/new").should route_to("parties#new")
end
Run Code Online (Sandbox Code Playgroud)

知道发生了什么事吗?

ruby-on-rails rails-routing rspec-rails

4
推荐指数
1
解决办法
1886
查看次数

Ruby on Rails重定向如何在路径文件中传递params

我们最近将我们网站上的产品名称从"手镯"更改为"腕带",并且需要保留旧的路线以用于搜索引擎优化目的.

基本上,这些路线

www.hostname.com/products/bracelets/series-1/
www.hostname.com/products/bracelets/series-1/small-purple

应该路由到

www.hostname.com/products/wristbands/series-1/
www.hostname.com/products/wristbands/series-1/small-purple

我正在阅读这里的教程http://guides.rubyonrails.org/routing.html#redirection,看起来我将使用块语法,但我仍然不确定如何正确地进行路由.我也想了解更多关于路线文件的信息,所以任何信息都会很棒.提前致谢

match "/bracelets/:name" => redirect {|params| "/wristbands/#{params[:name]}" }
Run Code Online (Sandbox Code Playgroud)

编辑:

好吧,我已经玩了一会儿,这就是它如何与我尝试过的一起工作

match "/products/bracelets/:name/:name2" => redirect {|params| "/products/wristbands/#{params[:name].pluralize}/#{params[:name2].pluralize}" }
Run Code Online (Sandbox Code Playgroud)

输入网址: localhost:3000/products/bracelets/series-1/small-purple

输出URL:localhost:3000/products/wristbands
错误消息:无效的产品:series-1
(所以匹配工作,但重定向没有)

如果我更改匹配以检查这样的params:

match "/products/balance-bracelets/:name/:name2" => redirect {|params| "/products/wristbands/#{params.inspect}" }
Run Code Online (Sandbox Code Playgroud)

我得到以下内容:

 /products/wristbands/{:name=>"series-1", :name2=>"small-purple"}
Run Code Online (Sandbox Code Playgroud)

所以它似乎没有识别第二个斜杠'/'或其他东西.有任何想法吗?

ruby ruby-on-rails rails-routing http-status-code-301

4
推荐指数
2
解决办法
3812
查看次数

Rails登陆页面路由和设计

我的网站应该像facebook.com一样工作.如果用户被记录并且如果它变为"/"则应该呈现为家庭控制器.如果没有记录,则应该渲染landing_page控制器

"/ "&& user_signed_in? ---> 家庭控制器

"/" && user_not_logged ---> landing_page控制器

我正在使用Rails 4和Devise

ApplicationController的

class ApplicationController < ActionController::Base

  before_filter :authenticate_user!
end
Run Code Online (Sandbox Code Playgroud)

的routes.rb

get "landing_page/index"

root 'home#index', :as => :home
Run Code Online (Sandbox Code Playgroud)

如何在ApplicationControl中保留一个"before_filter",除了"landing_page"控制器之外,它在每个控制器中运行?

更新

如果我转到"/ en/landing_page"它会正确渲染landing_page控制器(已注销),但如果我转到"/"它会将我重定向到"/ users/sign_in"

class LandingPageController < ApplicationController
  skip_before_action :authenticate_user!

  def index
  end

end

class ApplicationController < ActionController::Base

  before_action :authenticate_user!

end
Run Code Online (Sandbox Code Playgroud)

的routes.rb

 root 'landing_page#index'
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails rails-routing devise ruby-on-rails-4

4
推荐指数
1
解决办法
2782
查看次数

在调用动作之前,检查rails中是否存在header属性。

我正在Rails 4中构建API。在调用操作之前,我首先尝试检查http标头中是否存在属性。有没有办法检查控制器的所有动作中的每个动作。Rails文档中提到了类似

constraints(lambda { |req| req.env["HTTP_CUSTOM_HEADER"] =~ /value/ }) do
  #controller, action mapping
end
Run Code Online (Sandbox Code Playgroud)

但我仍想向使用我的API的用户提供反馈。类似于发送带有消息说明的json:missing the custom attribute in the header

ruby ruby-on-rails rails-routing ruby-on-rails-4.2

4
推荐指数
1
解决办法
1813
查看次数

如何在Ruby on Rails中更改路由名称

我正在一个RoR项目工作,我有一些路线,我想改变这些路径路径在浏览器上的显示方式.

我的路线:

get 'campaigns/:slug' => 'campaigns#show'
Run Code Online (Sandbox Code Playgroud)

结果:

http://localhost:3000/campaigns/cdlcuiaba
Run Code Online (Sandbox Code Playgroud)

我想要的是:

http://localhost:3000/cdlcuiaba
Run Code Online (Sandbox Code Playgroud)

谢谢

ruby url routes ruby-on-rails rails-routing

4
推荐指数
1
解决办法
707
查看次数

会话路由#destroy action

我正在链接到Sessions控制器的destroy动作,如下所示:

<%= link_to "Sign out", session_path, method: :delete  %>
Run Code Online (Sandbox Code Playgroud)

routes.rb中:

resources :sessions, only: [:new, :create, :destroy]
Run Code Online (Sandbox Code Playgroud)

Rails抱怨上面的链接:

没有路由匹配{:action =>"destroy",:controller =>"sessions"}缺少必需的键:[:id]

当没有对象ID提供链接时,如何链接到destroy操作并在Rails中保留REST /资源方法?

rest ruby-on-rails rails-routing ruby-on-rails-5

4
推荐指数
2
解决办法
2886
查看次数