我有一个Rails 3.0应用程序(工作在3.2升级),每当有人请求一个不存在的模板时,它会在生产中产生500错误.例如,mysite.com/blog_posts/532将ID为532的帖子作为HTML发送回来没有问题,但如果由于某种原因请求mysite.com/blog_posts/532.txt,该应用程序会引发500 ActionView :: MissingTemplate错误.
这不应该发生,因为模板首先不应该存在.它应该更恰当地是404错误,或者只是显示HTML模板.
如何让应用程序显示所有缺失模板错误的404错误,或显示默认的HTML模板而不是500?
日志:
Started GET "/blog_posts/73.txt" for 127.0.0.1 at 2013-05-20 21:22:51 -0400
Processing by BlogPostsController#show as TEXT
Parameters: {"id"=>"73"}
PK and serial sequence (2.0ms) SELECT attr.attname, seq.relname
FROM pg_class seq,
pg_attribute attr,
pg_depend dep,
pg_namespace name,
pg_constraint cons
WHERE seq.oid = dep.objid
AND seq.relkind = 'S'
AND attr.attrelid = dep.refobjid
AND attr.attnum = dep.refobjsubid
AND attr.attrelid = cons.conrelid
AND attr.attnum = cons.conkey[1]
AND cons.contype = 'p'
AND dep.refobjid = '"blog_posts_blog_tags"'::regclass
PK and custom sequence (1.0ms) …Run Code Online (Sandbox Code Playgroud) 我试图将局部变量从控制器传递到视图:
# pages_controller.rb
def my_method
render template: "pages/new_page", message: @message
end
# new_page.html.erb
<% if message %>
Do something
<% else %>
Do something else
<% end %>
Run Code Online (Sandbox Code Playgroud)
但这给了我未定义的局部变量或方法message错误,而在部分情况下这可以正常工作。
我知道这可以这样解决:
def my_method
render template: "pages/new_page", locals: { message: @message }
end
Run Code Online (Sandbox Code Playgroud)
我只是想知道,在没有当地人的情况下,这是如何工作的。
ruby-on-rails local-variables actionview partials actioncontroller
在 mimemagic 惨败之后,我最近将 Rails 6.0.3.5 应用程序升级到了 6.1.3。
现在,我看到渲染视图后发生的这个有趣的问题,这很奇怪。我该如何调试这个?该应用程序使用 Ruby 2.7.1
这是完整的堆栈跟踪
[31a95c67-7597-4856-9dfc-e813bb0d760a] Rendered layout layouts/application.html.erb (Duration: 5001.5ms | Allocations: 119937)
[31a95c67-7597-4856-9dfc-e813bb0d760a] Completed 200 OK in 5572ms (Views: 5005.9ms | ActiveRecord: 23.5ms | Allocations: 196152)
[31a95c67-7597-4856-9dfc-e813bb0d760a]
ArgumentError: wrong number of arguments (given 2, expected 3)
from /Users/aurs/.rvm/gems/ruby-2.7.1/gems/actionview-6.1.3.1/lib/action_view/base.rb:230:in `initialize'
from /Users/aurs/.rvm/gems/ruby-2.7.1/gems/web-console-3.7.0/lib/web_console/template.rb:21:in `new'
from /Users/aurs/.rvm/gems/ruby-2.7.1/gems/web-console-3.7.0/lib/web_console/template.rb:21:in `render'
from /Users/aurs/.rvm/gems/ruby-2.7.1/gems/web-console-3.7.0/lib/web_console/middleware.rb:37:in `block in call'
from /Users/aurs/.rvm/gems/ruby-2.7.1/gems/web-console-3.7.0/lib/web_console/middleware.rb:20:in `catch'
from /Users/aurs/.rvm/gems/ruby-2.7.1/gems/web-console-3.7.0/lib/web_console/middleware.rb:20:in `call'
from /Users/aurs/.rvm/gems/ruby-2.7.1/gems/actionpack-6.1.3.1/lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
from /Users/aurs/.rvm/gems/ruby-2.7.1/gems/railties-6.1.3.1/lib/rails/rack/logger.rb:37:in `call_app'
from /Users/aurs/.rvm/gems/ruby-2.7.1/gems/railties-6.1.3.1/lib/rails/rack/logger.rb:26:in `block in call'
from /Users/aurs/.rvm/gems/ruby-2.7.1/gems/activesupport-6.1.3.1/lib/active_support/tagged_logging.rb:99:in `block in tagged' …Run Code Online (Sandbox Code Playgroud) 我试图通过将一些逻辑移入FormBuilder来干掉一些代码.在阅读有关如何选择和替代表单构建器的文档后,对我来说逻辑解决方案似乎是这样的.
在视图中
<% form_for @event, :builder => TestFormBuilder do |f| %>
<%= f.test %>
<%= f.submit 'Update' %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
然后在app/helpers/application_helper.rb中
module ApplicationHelper
class TestFormBuilder < ActionView::Helpers::FormBuilder
def test
puts 'apa'
end
end
end
Run Code Online (Sandbox Code Playgroud)
但是,这在"form_for"中给出了一个错误
uninitialized constant ActionView::Base::CompiledTemplates::TestFormBuilder
Run Code Online (Sandbox Code Playgroud)
我在哪里做错了?
我在模板new.html.erb中有一个form_for,我正常保存到数据库,然后成功发送电子邮件.我希望邮件程序发送相同的new.html.erb作为正文并传递模型,以便完全填充表单.我收到以下错误:
undefined method `protect_against_forgery?' for #<#<Class:0x000000049d7110>:0x000000049d4690>
Run Code Online (Sandbox Code Playgroud)
在form_for标记之后的行上(因为它注入了我认为的auth令牌标记).有没有办法可以规避这一点,以便我可以在邮件中重复使用该模板?
这是邮件代码的样子
class MaintenanceMailer < ActionMailer::Base
helper :application
def request_email(maintenance)
mail :to => maintenance.community.email, :subject => "Maintenance" do |format|
format.html { render :layout => 'default', :template => 'maintenance/new' }
end
end
end
Run Code Online (Sandbox Code Playgroud) 我最近遇到了一个奇怪的问题或Rails 3,可能自从新的rubygems 1.5更新.基本上当我使用乘客3.0.2将程序部署到nginx时,我立即有500个页面,并且在我的生产日志中有类似的问题:
ActionView::Template::Error (couldn't parse YAML at line 105 column 13):
10: </div>
11: <% end %>
12: <div class="field">
13: <%= f.label :name %> <%= f.text_field :name %>
14: </div>
15: <div class="field">
16: <%= f.label :password %> <%= f.password_field :password %>
app/views/sessions/new.html.erb:13:in `block in _app_views_sessions_new_html_erb___4159562374589718885_19217640_4456777064017176818'
app/views/sessions/new.html.erb:5:in `_app_views_sessions_new_html_erb___4159562374589718885_19217640_4456777064017176818'
Run Code Online (Sandbox Code Playgroud)
看起来它在环境中缺少某些内容,因此它无法识别我的所有form_for元素.基本上该页面只是一个简单的登录页面,包含2个字段 - 名称和密码.对于具有表单的其他页面,也会出现此问题,但仅限于生产环境中.在开发环境中,它完全正常工作.我已将所有宝石升级到最新版本,包括rails 3.0.4,但这看起来与此问题并不完全相关.我也经常在我的VMware BEFORE gem 1.5上将相同的东西部署到ubuntu上,现在一切都还不错,但新部署没有回头路.
我已经将它部署到运行最新ubuntu的2台机器上,并且两台机器都有这样的错误.Nginx和乘客按标准步骤安装.显然,有了这个问题,该网站永远无法运行.任何人都可以为此提供任何错误修复?非常感谢,如果可以的话!
PS:我写的登录页面基本上来自这里:http: //railstutorial.org/chapters/sign-in-sign-out#top
我试过包括ActionView::Helpers::AssetTagHelper然后使用这个image_path()方法然而它让我感到悲伤:
undefined local variable or method `config' for ActionView::Helpers::AssetTagHelper:Module
Run Code Online (Sandbox Code Playgroud)
我可能还有一些简单的东西.有任何想法吗?
假设我正在输出一个帖子标题,在我们的数据库中,它是Hello Y’all- 我可以不使用输出它.html_safe,但是这样的方式它不能在html中输出Hello Y&#8217;all吗?
也就是说,如果用户从使用印刷正确的撇号的文字处理器复制帖子标题,我会得到乱码输出,因为它&在数据库中逃脱了&.当然,我想要Bonnie & Clyde输出数据库中的标题,Bonnie & Clyde因为这是正确的HTML ...
有安全的方法吗?
我正在尝试将rails应用程序从rails 4.0.2升级到4.1 beta,我按照http://edgeguides.rubyonrails.org/4_1_release_notes.html#action-pack-removals上给出的所有说明进行操作.每当我运行我的应用程序时,这就是我得到的错误
/Users/surendra/.rvm/gems/ruby-1.9.3-p448/gems/railties-4.1.0.beta1/lib/rails/railtie/configuration.rb:95:in `method_missing': undefined method `action_view' for # (NoMethodError)
from /Users/surendra/.rvm/gems/ruby-1.9.3-p448/gems/jquery-rails-3.0.4/lib/jquery/rails/railtie.rb:7:in `block in '
from /Users/surendra/.rvm/gems/ruby-1.9.3-p448/gems/activesupport-4.1.0.beta1/lib/active_support/lazy_load_hooks.rb:36:in `call'
from /Users/surendra/.rvm/gems/ruby-1.9.3-p448/gems/activesupport-4.1.0.beta1/lib/active_support/lazy_load_hooks.rb:36:in `execute_hook'
from /Users/surendra/.rvm/gems/ruby-1.9.3-p448/gems/activesupport-4.1.0.beta1/lib/active_support/lazy_load_hooks.rb:45:in `block in run_load_hooks'
from /Users/surendra/.rvm/gems/ruby-1.9.3-p448/gems/activesupport-4.1.0.beta1/lib/active_support/lazy_load_hooks.rb:44:in `each'
from /Users/surendra/.rvm/gems/ruby-1.9.3-p448/gems/activesupport-4.1.0.beta1/lib/active_support/lazy_load_hooks.rb:44:in `run_load_hooks'
from /Users/surendra/.rvm/gems/ruby-1.9.3-p448/gems/railties-4.1.0.beta1/lib/rails/application.rb:121:in `initialize'
from /Users/surendra/.rvm/gems/ruby-1.9.3-p448/gems/railties-4.1.0.beta1/lib/rails/railtie.rb:171:in `new'
from /Users/surendra/.rvm/gems/ruby-1.9.3-p448/gems/railties-4.1.0.beta1/lib/rails/railtie.rb:171:in `instance'
from /Users/surendra/.rvm/gems/ruby-1.9.3-p448/gems/railties-4.1.0.beta1/lib/rails/application.rb:90:in `inherited'
from /Users/surendra/Desktop/faces/config/application.rb:13:in `'
from /Users/surendra/Desktop/faces/config/application.rb:12:in `'
from /Users/surendra/.rvm/gems/ruby-1.9.3-p448/gems/railties-4.1.0.beta1/lib/rails/commands/commands_tasks.rb:79:in `require'
from /Users/surendra/.rvm/gems/ruby-1.9.3-p448/gems/railties-4.1.0.beta1/lib/rails/commands/commands_tasks.rb:79:in `block in server'
from /Users/surendra/.rvm/gems/ruby-1.9.3-p448/gems/railties-4.1.0.beta1/lib/rails/commands/commands_tasks.rb:76:in `tap'
from /Users/surendra/.rvm/gems/ruby-1.9.3-p448/gems/railties-4.1.0.beta1/lib/rails/commands/commands_tasks.rb:76:in `server'
from /Users/surendra/.rvm/gems/ruby-1.9.3-p448/gems/railties-4.1.0.beta1/lib/rails/commands/commands_tasks.rb:40:in `run_command!'
from /Users/surendra/.rvm/gems/ruby-1.9.3-p448/gems/railties-4.1.0.beta1/lib/rails/commands.rb:17:in `'
from bin/rails:4:in `require'
from bin/rails:4:in `'
我的application.rb文件就是这个 …
我正在通过创建一个"普通的旧Ruby"presenter对象来清理一些依赖于某些自定义控制器辅助方法的代码.在我的控制器中,我能够将视图上下文传递给类:
def show
# old code: view_context.bad_helper_method
@foobar = FoobarPresenter.new(Foobar.find(params[:id]), view_context)
end
class FoobarPresenter
def initialize(model, view_context)
@model = model
@view_context = view_context
end
def something
@view_context.bad_helper_method
end
end
Run Code Online (Sandbox Code Playgroud)
但是,我不确定在我的测试中应该通过什么.我宁愿动态地拉动helper/view_context,这样我就不必将其传入.
如何访问控制器外部的视图/控制器助手上下文?
这是一个Rails 3.2项目.
actionview ×10
actionmailer ×1
controller ×1
form-for ×1
form-helpers ×1
formbuilder ×1
partials ×1
ruby ×1
upgrade ×1
url ×1
yaml ×1