通常,在 Rails 中使用表单助手时,每个字段都直接与相应对象上的方法相关联。
但是,我有一个表单(用户注册)需要包含不属于用户模型本身(例如,卡片详细信息)但需要出现的字段。
我如何构建表单以便我可以获得必要的字段,并根据需要验证它们(以便它适合我的所有其他验证)而不会弄脏我的用户模型?
我必须渲染一些模板并将HTML块发送到SendGrid以进行电子邮件替换.所以,不幸的是,我在模型中进行了一些渲染,如下所示:
view = ActionView::Base.new(Rails.configuration.paths["app/views"].first)
view.render(:partial => template_name)
Run Code Online (Sandbox Code Playgroud)
即使我添加:
view.extend Rails.application.routes.url_helpers
view.extend ActionView::Helpers::UrlHelper
view.extend ApplicationHelper
Run Code Online (Sandbox Code Playgroud)
除非我明确定义模块,否则部分无法访问URL助手,例如url_for:
Rails.application.routes.url_helpers.edit_user_url(user, :host => Rails.application.config.action_mailer.default_url_options[:host])
Run Code Online (Sandbox Code Playgroud)
有没有更简洁的方法在模型调用的模板中使用URL Helper?
我已经看到这些错误很长时间了,但没有发现问题:
ActionView::MissingTemplate: Missing template pages/home, application/home with {:locale=>[:en], :formats=>["*/*;"]}
用户代理始终是 MSIE6(这是我之前放弃的部分原因)。
重现: curl -H "Accept: */*;" -I http://localhost:5000
有谁知道怎么修?
编辑
curl -H "Accept: */*" -I http://localhost:5000作品。仅当格式设置为*/*;(注意分号)时,它才起作用。
更新
我试图修改Mime:ALL的建议的意见,但无法拥有它同时接受*/*,并*/*;在同一时间。我看到的一个解决方案是在不存在或格式错误的 mime 类型时修补请求的处理方式,但我不确定如何处理。这个答案提供了一个线索,但我仍然没有。
更多更新
我仍然看到这些错误和更多。一个新的是:formats=>["hc/url;*/*"](Firefox)。我很惊讶这不会影响其他任何人,我认为我的代码中没有任何会导致不常见错误的特定内容。
根据rails文档,使用submit_tag助手将生成类似的内容
submit_tag\n# => <input name="commit" type="submit" value="Save changes" />\nRun Code Online (Sandbox Code Playgroud)\n\n它包括财产name="commit"
为什么这会被包括在内?它是某种标准吗?尝试理解“提交”在这种情况下的含义
我注意到点击提交后它被包含在params控制器内部。这是最近改变的吗?我认为只包含 url 参数和 POST/PUT 数据?
@参数
\n\n=> {“utf8”=>“\xe2\x9c\x93”,“authenticity_token”=>“4q3u+mfMi57YbchTAzaCI7WHmzfZJrLbTZ17aVwfq9uw8aMU1B3PBR13qfipgN6lbRoi0dywFU9i1AbJ0GP7UA==”,“电子邮件”=>“foo@example.co”, “密码”=>“(已编辑)", "dest"=>"", "commit"=>"登录", "controller"=>"sessions", "action"=>"log_in"}
谢谢!
\n我将应用程序从 rails 5.2 迁移到 rails 6。只剩下一件事要做,但我不知道如何做。
我有这个折旧警告:
弃用警告:ActionView::Base 实例应该使用查找上下文、赋值和控制器来构造。(从 /Users/xxx/xxxx/app/models/stock.rb:42 处的 new 调用)
从这个代码:
view = ActionView::Base.with_empty_template_cache.new(
ActionController::Base.view_paths,
categories: categories,
periods: periods
)
result = view.render formats: [:xlsx],
handlers: [:axlsx],
template: 'admin/reports/logistics/stocks_by_age'
Run Code Online (Sandbox Code Playgroud)
我不明白如何解决它。我去查看源代码中的折旧,但它没有帮助我弄清楚我应该做什么,而且我没有真正找到任何有关此“查找”的文档。
请问有人可以帮我理解这种折旧吗?
我的ApplicationController中有一个错误处理方法:
rescue_from ActiveRecord::RecordNotFound, :with => :not_found
def not_found(exception)
@exception = exception
render :template => '/errors/not_found', :status => 404
end
Run Code Online (Sandbox Code Playgroud)
在RAILS_ROOT/app/views/errors/not_found.html.erb,我有这个:
<h1>Error 404: Not Found</h1>
<%= debug @exception %>
Run Code Online (Sandbox Code Playgroud)
但@exception总是nil在那里.我试过了debug assigns,但总是这样{}.打电话时不会复制分配render :template吗?如果是这样,我怎么能得到它们?
我在边缘Rails.
对于插件,我想将以下功能入侵到Rails:
当(部分)模板不存在(无论格式如何)时,我想渲染默认模板.
所以说如果users/index.html.erb不存在(或其他格式),我会调用一个'users/index'动作,应该呈现'default/index.html.erb'.
同样,如果我调用某个操作'locations/edit'并且'locations/edit.html.erb'不存在,则应该呈现'default/edit.html.erb'
对于partials,如果我调用一个动作'locations/index'并且模板'locations/index.html.erb'调用不存在的部分'locations/_location',它应该呈现'default/_object'
解决方案是seek,允许我访问模板变量(例如@users,@ locations)和所请求路径的信息(例如用户/索引,位置/编辑).它也应该与偏见一起使用.
我想到了一些选项,我将在下面发布.他们都不是完全令人满意的.
如果我想创建一个新的rails gem,为Rails视图添加方法,那么正确的方法是什么?它是否扩展ActionView :: Base?它会以某种方式涉及ApplicationHelper吗?
在rails 3.2.0中,是否可以在生产环境中关闭用于在ActionView :: LogSubscriber中呈现视图的rails日志记录.
目前只有我发现supress的方法是对它进行修补并通过以下方式增加日志级别进行调试.有没有更好的方法来执行此操作或任何配置?
module ActionView
class LogSubscriber
def render_template(event)
message = "Rendered #{from_rails_root(event.payload[:identifier])}"
message << " within #{from_rails_root(event.payload[:layout])}" if event.payload[:layout]
message << (" (%.1fms)" % event.duration)
debug(message)
end
alias :render_partial :render_template
alias :render_collection :render_template
end
end
Run Code Online (Sandbox Code Playgroud) 在应用程序的管理面板中,应该引入新表单.我想使用2.3依赖RoR指南中描述的记录识别,但如果我说的话
form_for(@product)
Run Code Online (Sandbox Code Playgroud)
要么
form_for [:backend, @product]
Run Code Online (Sandbox Code Playgroud)
它扔了一个ArgumentError: Missing block.这是用于后端 - 新功能,控制器在其中controller/backend/product_controller定义
def new
@product = Product.new
end
Run Code Online (Sandbox Code Playgroud)
我做错了什么?为什么这不起作用?