我有一个包含内容列表的表单,以及已经到位的更新项目的操作。
我想要另一个按钮,单击该按钮会触发不同的操作以删除所选项目。
= 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。
有没有更优雅的方法来做到这一点,即让它只路由到正确的方法?
谢谢你的帮助...
在我们的 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) 在 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) 我的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)
解决此路由冲突的最惯用方法是什么?
我得到了一个失败的测试,我调试很困难.
我的测试用例是:
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)
知道发生了什么事吗?
我们最近将我们网站上的产品名称从"手镯"更改为"腕带",并且需要保留旧的路线以用于搜索引擎优化目的.
基本上,这些路线
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)
所以它似乎没有识别第二个斜杠'/'或其他东西.有任何想法吗?
我的网站应该像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) 我正在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
我正在一个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)
谢谢
我正在链接到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 /资源方法?
rails-routing ×10
ruby ×4
routes ×2
devise ×1
heroku ×1
lets-encrypt ×1
rest ×1
rspec-rails ×1
url ×1