现在我正在使用它适用于开发主机,但是当我转向生产时,我必须手动更改{:host =>""}代码.
def share_all
url = Rails.application.routes.url_helpers.post_url(self, :host => 'localhost:3000')
if user.authentications.where(:provider => 'twitter').any?
user.twitter_share(url)
end
end
Run Code Online (Sandbox Code Playgroud)
我想使用它然后定义每个环境的default_url_options:
def share_all
url = Rails.application.routes.url_helpers.post_url(self)
if user.authentications.where(:provider => 'twitter').any?
user.twitter_share(url)
end
end
Run Code Online (Sandbox Code Playgroud)
我已经尝试将此添加到我的config/environments/development.rb但我仍然得到"缺少主机链接到!请提供:host参数或设置default_url_options [:host]"错误
config.action_controller.default_url_options = {:host => "localhost:3000"}
Run Code Online (Sandbox Code Playgroud)
我甚至用这种方式尝试过:
config.action_controller.default_url_options = {:host => "localhost", :port => "3000"}
Run Code Online (Sandbox Code Playgroud)
编辑:
我现在也遵循了这个并且仍然是相同的错误指南http://edgeguides.rubyonrails.org/action_controller_overview.html#default_url_options
class ApplicationController < ActionController::Base
protect_from_forgery
include ApplicationHelper
def default_url_options
if Rails.env.production?
{ :host => "example.com"}
else
{:host => "example1.com"}
end
end
end
Run Code Online (Sandbox Code Playgroud)
这让我发疯,我在这里失踪了什么?
我有一个"软件即服务"应用程序,它使用通过RESTful API传递的JSON.
简单地说:在使用带有JSON数据交换的RESTful API时,捕获和报告异常的最佳实践是什么?
我的第一个想法是通过生成脚手架来看看Rails的作用,但这显然是不对的.这是一段摘录:
class MumblesController < ApplicationController
# GET /mumbles/1
# GET /mumbles/1.json
def show
@mumble = Mumble.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @mumble }
end
end
end
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果JSON代码发送不存在的ID,例如
http://www.myhost.com/mumbles/99999.json
Run Code Online (Sandbox Code Playgroud)
那么Mumble.find()将引发ActiveRecord :: RecordNotFound.ActionController将捕获它并在HTML中呈现错误页面.但HTML对于期望JSON的客户端来说是无用的.
我可以通过将Mumble.find()包装在一个begin ... rescue RuntimeError
块中并渲染JSON status =>:unprocessable_entity等来解决这个问题.
但是,如果客户端的应用程序发送无效路径,例如:
http://www.myhost.com/badtypo/1.json
Run Code Online (Sandbox Code Playgroud)
是一个基于JSON的应用程序应该捕获并返回JSON中的错误?如果是这样,我在哪里捕获它而不深入ActionDispatch?
总的来说,如果出现错误,我是否应该让ActionController生成HTML?那感觉不对......
主要编辑:自从最初发现这个问题以来,我已将其削减到下面.我认为现在对这个问题的描述略微准确.因此,对OP的评论可能不完全相关.
编辑在rails/puma项目中发布的轻微修改版本:https://github.com/rails/rails/issues/21209,https://github.com/puma/puma/issues/758
编辑现在转载OS X和Rainbows
简介: 当使用Puma并运行长时间运行的连接时,我一直收到与跨越线程的ActiveRecord连接相关的错误.这表现在消息 message type 0x## arrived from server while idle
和锁定(崩溃)服务器中.
设置:
mysqld 5.6.25-0ubuntu0.15.04.1
)2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
/ Rubiniusrbx-2.5.8
4.2.3
,4.2.1
)2.12.2
,2.11
)pg-0.18.2
)/ mysql2请注意,并非所有上述版本的组合都已尝试过.首先列出的版本是我目前正在测试的版本.
rails new issue-test
get 'events' => 'streaming#events'
streaming_controller.rb
pool: 2
但看到不同的池大小)码:
class StreamingController < ApplicationController
include …
Run Code Online (Sandbox Code Playgroud) ruby multithreading connection-pooling ruby-on-rails actioncontroller
我正在编写一个使用普通旧Ruby对象(PORO)从控制器中抽象出授权逻辑的应用程序.
目前,我有调用自定义异常类NotAuthorized
,我rescue_from
在控制器级别,但我很好奇,想知道:是否导轨4已经配备了一个例外,表明一个动作没有被授权?我是通过实施这个例外来重新发明轮子的吗?
澄清:raise AuthorizationException
控制器内部没有发生任何事情,它发生在控制器外部完全分离的PORO内部.该对象不了解HTTP,路由或控制器.
使用方法:layout_for_namespace我设置我的应用程序的布局取决于我是在前端还是后端,因为后端使用命名空间"admin".
我找不到一个很好的方法来找出我是哪个命名空间,我找到的唯一方法是从params [:controller]解析字符串.当然这很容易,似乎是安全的,并且运行良好.但我只是想知道是否有更好的,准备好的方法来做到这一点.有人知道吗?
目前我只使用以下方法:
def is_backend_namespace?
params[:controller].index("admin/") == 0
end
Run Code Online (Sandbox Code Playgroud)
提前致谢
阿恩
我试图aspnetuser
从不同的控制器(而不是accountcontroller
)设置表中的列的值.我一直试图访问,UserManager
但我不知道如何做到这一点.
到目前为止,我已经在控制器中尝试了以下内容我想用它:
ApplicationUser u = UserManager.FindById(User.Identity.GetUserId());
u.IsRegComplete = true;
UserManager.Update(u);
Run Code Online (Sandbox Code Playgroud)
这不会编译(我想因为UserManager
还没有实例化控制器)
我还尝试创建一个公共方法,AccountController
以接受我想要更改值的值并在那里做,但我无法弄清楚如何调用它.
public void setIsRegComplete(Boolean setValue)
{
ApplicationUser u = UserManager.FindById(User.Identity.GetUserId());
u.IsRegComplete = setValue;
UserManager.Update(u);
return;
}
Run Code Online (Sandbox Code Playgroud)
如何访问和编辑帐户控制器之外的用户数据?
更新:
我尝试在其他控制器中实例化UserManager,如下所示:
var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(db));
ApplicationUser u = userManager.FindById(User.Identity.GetUserId());
Run Code Online (Sandbox Code Playgroud)
我的项目符合(有点兴奋),但当我运行代码时,我收到以下错误:
Additional information: The entity type ApplicationUser is not part of the model for the current context.
Run Code Online (Sandbox Code Playgroud)
更新2:
我已将该功能移至IdentityModel(不要问我在这里抓住吸管),如下所示:
public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) …
Run Code Online (Sandbox Code Playgroud) asp.net-mvc actioncontroller asp.net-mvc-5 asp.net-identity-2
我正在处理一个相当传统的忘记密码电子邮件 - 我想通过电子邮件向用户发送密码更改令牌,这些令牌嵌入在链接中,他们可以点击这些令牌来更改密码.我通过传统的ActionMailer发送电子邮件.
如果我使用普通的link_to标签
<%= link_to "click here", :controller => foo, :action => 'bar', :token => token %>
Run Code Online (Sandbox Code Playgroud)
我得到一个相对链接 - 相当无用的电子邮件.
如果我加入
:only_path => false
,然后它说我需要设置错误default_url_options[:host]
.ActionController文档暗示您通过覆盖控制器中的#default_url_options方法来实现这一点.当然有一个配置选项告诉Rails它的主机名是什么,而不添加我自己的配置文件,解析它等?
我刚刚升级到Rails 5并且一切都很顺利但是没有明显的原因,一个被调用的方法skip_before_action
不允许rspec运行此消息
在process_action回调之前:尚未定义redirect_heroku_user(ArgumentError)
这是非常奇怪的,因为它在rails 4上运行得很好.这是我的代码:
# application_controller.rb
def redirect_heroku_user
redirect_to root_path if heroku_user?
end
# some_controller.rb
skip_before_action :redirect_heroku_user, only: :edit
Run Code Online (Sandbox Code Playgroud) 对于那里的rails专家,我想知道在Web应用程序中的每个操作执行相同代码的位置和方式?如果你能指出我的文章或提供一个简短的代码片段,我将非常感激.
提前感谢任何可以提供帮助的人.
由于不推荐使用ActionController :: Base#default_url_options,我想知道如何在rails3中设置默认的url选项.默认URL选项不是静态的,而是依赖于当前请求.
http://apidock.com/rails/ActionController/Base/default_url_options
谢谢,科林
actioncontroller ×10
ruby ×3
actionmailer ×1
asp.net-mvc ×1
hostname ×1
json ×1
namespaces ×1
rspec ×1