标签: actioncontroller

RoR - 首选 - 机架中间件或主动控制器滤波器?

对于最新版本的Ruby on Rails(在提出这个问题时有4个),实现修改请求/响应的代码(如身份验证机制)的首选方法是什么.我看到很多站点和教程都提倡Rack中间件,而似乎可以通过Action Controller过滤器方法实现相同的功能.

除了讨论首选方法之外,还可以比较每种方法的优缺点吗?在我的初步调查中,似乎动作控制器过滤器方法更紧密地集成到RoR应用程序中,这样您就可以绕过在某些控制器端点上运行某些过滤器,而中间件似乎无法具有该级别的控制.像这样的细节会很棒.谢谢!

ruby ruby-on-rails actioncontroller rack-middleware ruby-on-rails-4

9
推荐指数
1
解决办法
1448
查看次数

Rails 6 - 常量 ActionController::InvalidAuthenticityToken

我正在修改 Rails 6 并且我不断在由 rails 生成的表单上获取 ActionController::InvalidAuthenticityToken,例如(实现 rails 教程书籍注册/登录流程)

<%= form_for(@user, url: 'signup') do |f| %>
     <%= render 'partials/error_messages' %>
     <%= f.label :name, "Nimi" %>
     <%= f.text_field :name %>
     <%= f.label :email, "E-mail" %>
     <%= f.email_field :email %>
     <%= f.label :password, "Parool" %>
     <%= f.password_field :password %>
     <%= f.label :password_confirmation, "Korda parooli" %>
     <%= f.password_field :password_confirmation %>
     <%= f.submit "Loo konto", class: "button-green" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

这发生在所有形式上,输出转储看起来像这样

转储

应用程序.html.erb

<!DOCTYPE html>
<html>
  <head>
    <title>Storebase - kaasaegsed e-poed!</title>
    <%= csrf_meta_tags %> …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails csrf actioncontroller authenticity-token ruby-on-rails-6

9
推荐指数
1
解决办法
4195
查看次数

为什么Rails参数包装不包含来自URI的全局内容?

参数包装状态的文档:

将参数哈希包装到嵌套哈希中.这将允许客户端提交POST请求,而无需指定任何根元素.

它有助于省略包装哪些参数哈希.该动作控制器概述指南给出了这样的破败:

Rails收集与params散列中的请求一起发送的所有参数,无论它们是作为查询字符串还是帖子正文的一部分发送.[...] query_parameters哈希包含作为查询字符串的一部分发送的参数,而request_parameters哈希包含作为帖子正文的一部分发送的参数.所述path_parameters散列包含由所述路由为导致该特定控制器和动作路径的一部分可识别的参数.

当您使用RESTful资源和路由时,会发生这种乐趣.假设你有一个模型A has_many Bs; 因此B具有外键a_id.

POST /as/1/bs有一个空的有效负载(因为B没有其他字段).假设a_idattr_accessible,人们可能会认为a_id它将被包裹在一个b对象中.相反,你会看到:

Processing by BsController#create as HTML
  Parameters: {"b"=>{}, "a_id" => "1"}
Run Code Online (Sandbox Code Playgroud)

没有这样的运气.事实证明,ParamsWrapper使用request_parameters和不使用params,因此不包括a_idPOST有效负载意味着它不会被包装.这是非常令人困惑的,因为你仍然看到它包含在内params,因为URI通配,并想知道为什么它被排除在所有东西之外.

有没有什么好的理由可以使用request_parameters而不是params在这里?

我可以理解,从"REST哲学"的角度来看,如果我们假设有效载荷包含整个对象,它就更纯粹了,但这实际上意味着a_idURI中的内容被完全忽略,这似乎很可惜.

TL; DR: ParamsWrapper使用request_parameters作为参数源,所以URI-匹配替换的变量被跳过.这是一个Rails错误吗?纯REST倡导者可能会说不,但实用主义暗示是.

ruby-on-rails actioncontroller

8
推荐指数
1
解决办法
977
查看次数

如何使用GRAPE API允许二进制文件下载

我想允许使用ruby的Grape API下载二进制文件(.p12文件).这就是我想要的.

get '/download_file' do
  pkcs12 = generate_pkcsfile 
  content_type('application/octet-stream')
  body(pkcs12.der)
end
Run Code Online (Sandbox Code Playgroud)

使用ActionController的等效代码是

begin
  pkcs12 = generate_pkcsfile
  send_data(pkcs12.der,
            :filename => 'filename.p12')
end
Run Code Online (Sandbox Code Playgroud)

问题是使用API​​下载的文件似乎是一个文本文件,每个字符都嵌入了'\ ufffd'前缀,而使用浏览器下载的文件似乎是二进制文件.如何使用GRAPE API框架允许下载通过ActionController的send_data下载的同一文件

ruby api ruby-on-rails actioncontroller grape-api

8
推荐指数
2
解决办法
5852
查看次数

Rails ActionController未知格式

我正在尝试渲染xlsx文件.但我一直在接受406/UnknowFormat.我做了正确的设置,也许我错过了什么?

Rails 4.2 app

gem 'axlsx'
gem "axlsx_rails"
gem 'zip-zip'
Run Code Online (Sandbox Code Playgroud)

配置/初始化/ MIME

Mime::Type.register "application/xlsx", :xlsx

调节器

respond_to do |format|
      format.xlsx { render xlsx: "create", template: "api/reports/create" }
end
Run Code Online (Sandbox Code Playgroud)

意见/ API /报告/ create.xlsx.axlsx

wb = xlsx_package.workbook
wb.add_worksheet(name: "Reports") do |sheet|
  sheet.add_row [@report_name]
end
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails actioncontroller axlsx

8
推荐指数
2
解决办法
1万
查看次数

从路由错误轨道3.1救援

如何从RoutingErrorrails 3.1应用程序中解救.如果我错了,可以rescue_from RoutingError在应用程序控制器中使用,但现在不可能.

ruby ruby-on-rails actioncontroller

7
推荐指数
2
解决办法
4545
查看次数

Ruby on Rails 301重定向

我添加了slugs到一些模型,但由于SEO我需要从旧链接做301重定向:旧:

http://host.com/foo/1
Run Code Online (Sandbox Code Playgroud)

新:

http://host.com/foo/foo_slug
Run Code Online (Sandbox Code Playgroud)

问题:在这种情况下如何实现301重定向?是否可以从大写链接实现301重定向?像这样:

http://host.com/foo/FOO_SLUG -> http://host.com/foo/foo_slug
Run Code Online (Sandbox Code Playgroud)

seo redirect ruby-on-rails actioncontroller

7
推荐指数
1
解决办法
7539
查看次数

Rails"行动"扼杀了关键冲突

我正在构建一个包含各种CRUD端点的RESTful Rails服务.在其中一个Create端点上,我传入的数据包括:

...
action: "action_name"
...
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是params[:action]包含"create",而不是action我传入的参数的实际值.我认为这是因为params[:action]Rails会自动填充.

有没有其他方法来访问我传递的这个键?我做了一些公然愚蠢的事吗?

ruby ruby-on-rails actioncontroller

7
推荐指数
2
解决办法
352
查看次数

Rails 4.2 ActionController:BadRequest自定义错误消息

如果验证失败或缺少参数,我想从我的控制器返回400 - bad request.所以在我的控制器中如果有

if params["patch"].nil? then
  raise ActionController::BadRequest.new( "The Json body needs to be wrapped inside a \"Patch\" key")
end
Run Code Online (Sandbox Code Playgroud)

我在我的应用程序控制器中捕获此错误:

rescue_from ActionController::BadRequest, with: :bad_request


def bad_request(exception)
  render status: 400, json: {:error => exception.message}.to_json
end
Run Code Online (Sandbox Code Playgroud)

但似乎我无法在提升时添加自定义消息ActionController::BadRequest.因为当传递无效的主体时,响应仅是,{"error":"ActionController::BadRequest"}而不是我提供的哈希.

在控制台中,我得到了相同的行为. raise ActiveRecord::RecordNotFound, "foo" 确实提高了ActiveRecord::RecordNotFound: foo.

raise ActionController::BadRequest, "baa" 结果是

ActionController::BadRequest: ActionController::BadRequest

如何向BadRequest异常添加自定义消息?

ruby ruby-on-rails actioncontroller ruby-on-rails-4

7
推荐指数
1
解决办法
4737
查看次数

捕获的最佳方法:在Rails 5控制器中抛出中止信号

在Rails 5中,当回调需要取消以后的回调时,建议的过程记录为"你应该明确地" throw :abort.

我的问题是:如何建议捕获此异常?

我目前的解决方案是抓住UncaughtThrowErrorApplicationController- 考虑到它的记录方式,我认为这个功能会触发Rails或Rack中间件中的一些魔法,以立即进入渲染(ActionView)阶段.

actioncontroller ruby-on-rails-5

7
推荐指数
1
解决办法
1180
查看次数