从用户交互的角度来看,具有嵌入式链接的闪存消息(通知,错误,警告等)的能力是很好的.但是,在来自控制器的flash消息中嵌入锚标记很脏.
让我们假设像这样的flash消息对于可用性*是有益的:
嵌入式链接示例Flash消息通知http://img.skitch.com/20090826-xbsa4tb3sjq4fig9nmatakthx3.png (借自DailyMile.com)
在控制器和视图之间采取什么策略来干净利用这样的东西?
我正在尝试编写一个简单的Sinatra,但我需要动作包中的ActionView :: Helpers :: NumberHelper. http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html
问题是,我该如何安装和使用它?
irb(main):001:0> require 'action_view/helpers/number_helper'
irb(main):002:0> number_with_precision(1)
NoMethodError: undefined method `number_with_precision' for main:Object
irb(main):004:0> ActionView::Helpers::NumberHelper.number_with_precision(1)
NoMethodError: undefined method `number_with_precision' for ActionView::Helpers::NumberHelper:Module
Run Code Online (Sandbox Code Playgroud)
为什么这个简单的步骤不起作用?
而且,如果我需要所有废话:
irb(main):001:0> require 'action_pack'
irb(main):004:0> require 'action_view'
irb(main):005:0> include ActionView::Helpers::NumberHelper
irb(main):006:0> number_to_phone(12345)
NoMethodError: undefined method `starts_with?' for "12345":String
Run Code Online (Sandbox Code Playgroud)
如何理解所有这一切?为什么这个模块不起作用?为什么它不需要它需要什么?它需要什么?starts_with在哪里?
谷歌对这些问题完全保持沉默.
UPD:现在我得到以下内容
number_with_precision(1, :locale => 'fr')
TypeError: wrong argument type nil (expected Fixnum)
Run Code Online (Sandbox Code Playgroud)
在我看来,我的NumberHelper已经坏了.这不是一个好的行为.
大脑有点油炸....如何得到:控制器的哈希值:来自relative_path的动作?
这基本上与url_for相反.在下面的例子中,"some_function"是我正在寻找的神秘函数名称......我知道它很简单,只是记不住或者似乎无法在文档中找到它.
像这样:
some_function('/posts/1/edit')
=> {:controller => 'posts', :action => 'edit', :id => '1'}
Run Code Online (Sandbox Code Playgroud) 我遇到Active Admin问题.以下是版本:
红宝石'2.2.1'
rails'4.2.0'
activeadmin:1.0.0.pre1
arbre:1.0.3(提到这个,因为它似乎与我的问题有关联)
我们升级到rails 4.2并且还必须升级activeadmin(从0.5开始).经过几次调整(特别是授权系统),一切似乎都很好,除了一个大问题:我只能访问索引页面.当转到带有ID的页面时(例如:" http:// localhost:3000/admin/companies/2968 "),我收到此错误:
没有路由匹配{:action =>"edit",:controller =>"admin/companies",:format => nil,:id =>#{User id:nil,[所有具有nil值的用户属性]}}.缺少必需的密钥:[:id]
看起来param [:id]以某种方式变为空用户,这当然会让它破裂.
这就是我所知道的:
当我将一个binding.pry放在我的ApplicationController上并检查params时,我得到{:action =>"edit",:controller =>"admin/companies",:format => nil,:id => 2968}(所以这里没问题)
引发错误的行是:
active_admin /资源/ show.html.arb
- > arbre/element/builder_method.rb #insert_tag
- > arbre/element/builder_method.rb #build_tag
- > actionpack/actiondispatch/journey/formatter#generate(调用此方法时,path_parameters ID值已损坏,从而引发错误)
知道为什么我的ID参数没有正确解释/我可以进一步查看的地方吗?
编辑>>我在我的routes.rb中有这个
ActiveAdmin.routes(self)
devise_for :admin_users, ActiveAdmin::Devise.config
Run Code Online (Sandbox Code Playgroud)
并且生成的路线看起来很好用rake路线(在这个特定的例子中,我有admin/companies#edit admin_company GET /admin/companies/:id(.:format)
EDIT2 >>如果不清楚,这种情况发生在所有节目页面上.如果我去http:// localhost:3000/admin/projects /例如,它工作正常,但http:// localhost:3000/admin/projects/23815给了我id =空用户以及
我在我的应用程序中to_param使用创建自定义URL(此自定义路径包含斜杠):
class Machine < ActiveRecord::Base
def to_param
MachinePrettyPath.show_path(self, cut_model_text: true)
end
end
Run Code Online (Sandbox Code Playgroud)
问题是,由于Rails 4.1.2行为已更改且Rails不允许在URL中使用斜杠(使用自定义URL时),因此它会转义斜杠.
我有这样的路线:
Rails.application.routes.draw do
scope "(:locale)", locale: /#{I18n.available_locales.join("|")}/ do
resources :machines, except: :destroy do
collection do
get :search
get 'search/:ad_type(/:machine_type(/:machine_subtype(/:brand)))', action: 'search', as: :pretty_search
get ':subcategory/:brand(/:model)/:id', action: 'show', as: :pretty
patch ':subcategory/:brand(/:model)/:id', action: 'update' # To be able to update machines with new rich paths.
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
我尝试在线程中推荐使用glob param只为show方法确保它的工作原理:
resources :machines, except: :destroy do
#...
end
scope format: false …Run Code Online (Sandbox Code Playgroud) 我试图从API访问rails应用程序资源(它发送一个Application/XML GET请求),我不想解析XML文件.
在我的资源控制器中,我有以下内容:
def get_resource
@my_resource = Resources.new
render :xml => @my_resource
end
Run Code Online (Sandbox Code Playgroud)
它按预期生成xml文件.如果我用以下代替:
render :layout => false
Run Code Online (Sandbox Code Playgroud)
我的API报告"模板丢失"错误.我也尝试过以下方法:
render :xml => @identity, :layout => false
Run Code Online (Sandbox Code Playgroud)
但无论如何页面呈现.什么是正确的方法?
在迁移到Rails 5.0.0.beta1时,我发现了很多弃用警告:
DEPRECATION WARNING: env is deprecated and will be removed from Rails 5.0. (called from XXX at YYY)
Run Code Online (Sandbox Code Playgroud)
我试图摆脱它,并试图找到一个替代方案,但在actionpack changelog中找不到任何东西.
有任何想法吗 ?
如果我正确地理解它,Action Pack(见这里:https://partner.microsoft.com/global/40138499)似乎是非常好的价值.
价格是490美元,如果我理解正确,它会附带3x VS2010 Professional许可证,最重要的是,10个Office 2010 Professional Plus用户,1x Server 2008 R2,1x Exchange Server,大量CALS的商业使用许可证.我在这里错过了什么吗?它看起来很便宜.
我知道调用params.permit(:foo)会创建一个列入白名单的新ActionController::Parameters实例,:foo以便您可以使用它实例化模型。但是为什么 Discourse CMS 中的以下代码调用它而不使用它的返回值呢?
discourse/app/controllers/drafts_controller.rb: GitHub
class DraftsController < ApplicationController
# [...]
def index
# [...]
params.permit(:offset)
params.permit(:limit)
# [...]
opts = {
# [...]
offset: params[:offset],
limit: params[:limit]
}
stream = Draft.stream(opts)
Run Code Online (Sandbox Code Playgroud) 我有一个不从应用程序控制器继承的 API 控制器。我正在尝试包含 respond_to 方法并得到一个方法未定义的错误......所以我需要在顶部使用 actionpack,如下所示:
require 'actionpack'
class Api::V1::UsersController < Api::ApiController
version 1
doorkeeper_for :all
respond_to :json
def show
respond_with current_user.as_json(except: :password_digest)
end
end
Run Code Online (Sandbox Code Playgroud)
我得到了以下信息:
LoadError(无法加载此类文件--actionpack):app/controllers/api/v1/users_controller.rb:1:in `'
我的Gemfile 和 Rails 4.1.2 中已经有gem 'actionpack'(这是 Rails 4 应用程序的一部分)
我在Rails 4.1.2应用程序中有一个API控制器,它不从Application控制器继承.我正在尝试包含respond_to方法并获取方法未定义错误....所以然后我需要在顶部的actionpack,如下所示:
require 'action_pack'
class Api::V1::UsersController < Api::ApiController
version 1
doorkeeper_for :all
respond_to :json
def show
respond_with current_user.as_json(except: :password_digest)
end
end
Run Code Online (Sandbox Code Playgroud)
我还是得到了
ActionController::RoutingError (undefined method `respond_to' for Api::V1::UsersController:Class):
Run Code Online (Sandbox Code Playgroud)
但是respond_to方法是MODULE ActionController :: MimeResponds :: ClassMethods的一部分,如果我打开actionpack gem源代码,它可以在子目录的action_pack文件夹下找到.
编辑:
我还应该提到Api :: ApiController有一个父RocketPants :: Base,因为我正在使用火箭pi宝石......宝石的作者在他的自述文件中说:"RocketPants只包括最低限度的apis.在不久的将来,它可以被修改为与ActionController :: Base一起使用,以便更好地与其他宝石兼容."
我特别感兴趣的是如何以独立的方式访问action_pack方法/库(如果可能的话),就像你包含activesupport一样.
试图启动Rails服务器并获得"警告",我不明白.谁知道这意味着什么?warning: already initialized constant ICS
这是在上下文中:
meltemi$ rails s
=> Booting WEBrick
=> Rails 3.1.3 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
/Users/meltemi/.rvm/gems/ruby-1.9.3-p0@summit/gems/actionpack-3.1.3/lib/action_dispatch/http/mime_type.rb:101: warning: already initialized constant ICS
[2012-01-15 12:28:34] INFO WEBrick 1.3.1
[2012-01-15 12:28:34] INFO ruby 1.9.3 (2011-10-30) [x86_64-darwin11.2.0]
[2012-01-15 12:28:34] INFO WEBrick::HTTPServer#start: pid=61345 port=3000
Run Code Online (Sandbox Code Playgroud) 我在使用 Rails 和 heroku 时遇到了这个问题:在我的电脑上一切正常,但由于此错误,heroku 上的相同应用程序不起作用:
/app/vendor/bundle/ruby/2.2.0/gems/actionpack-4.2.4/lib/abstract_controller/helpers.rb:180:in `include': wrong argument type Class (expected Module) (TypeError)
Run Code Online (Sandbox Code Playgroud)
我在这里粘贴完整的堆栈跟踪:
$: heroku run rails console
Running rails console on myapp... up, run.4782
/app/vendor/bundle/ruby/2.2.0/gems/actionpack-4.2.4/lib/abstract_controller/helpers.rb:180:in `include': wrong argument type Class (expected Module) (TypeError)
from /app/vendor/bundle/ruby/2.2.0/gems/actionpack-4.2.4/lib/abstract_controller/helpers.rb:180:in `block in add_template_helper'
from /app/vendor/bundle/ruby/2.2.0/gems/actionpack-4.2.4/lib/abstract_controller/helpers.rb:180:in `module_eval'
from /app/vendor/bundle/ruby/2.2.0/gems/actionpack-4.2.4/lib/abstract_controller/helpers.rb:180:in `add_template_helper'
from /app/vendor/bundle/ruby/2.2.0/gems/actionpack-4.2.4/lib/abstract_controller/helpers.rb:109:in `block in helper'
from /app/vendor/bundle/ruby/2.2.0/gems/actionpack-4.2.4/lib/abstract_controller/helpers.rb:108:in `each'
from /app/vendor/bundle/ruby/2.2.0/gems/actionpack-4.2.4/lib/abstract_controller/helpers.rb:108:in `helper'
from /app/vendor/bundle/ruby/2.2.0/gems/actionpack-4.2.4/lib/action_controller/railties/helpers.rb:17:in `inherited'
from /app/app/controllers/application_controller.rb:1:in `<top (required)>'
from /app/vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.4/lib/active_support/dependencies.rb:274:in `require'
from /app/vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.4/lib/active_support/dependencies.rb:274:in `block in require'
from /app/vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.4/lib/active_support/dependencies.rb:240:in `load_dependency'
from /app/vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.4/lib/active_support/dependencies.rb:274:in `require' …Run Code Online (Sandbox Code Playgroud) actionpack ×13
ruby ×9
require ×2
activeadmin ×1
arbre ×1
discourse ×1
heroku ×1
licensing ×1
msdn ×1
render ×1
routing ×1
rvm ×1
sinatra ×1
url-routing ×1