我们正在从Rails 4.2.5升级到5.0.0.beta1
在测试时,我们希望看到像以前一样使用分页链接呈现的索引视图.但是我们现在得到一个ArgumentError错误页面,例如:
ArgumentError in Transactions#index
/app/views/kaminari/_paginator.html.erb where line #10 raised:
<%= paginator.render do -%>
Generating an URL from non sanitized request parameters is insecure!
Application Trace | Framework Trace | Full Trace
app/views/kaminari/_paginator.html.erb:10:in block in _app_views_kaminari__paginator_html_erb___4026289994022119719_69904100316060' app/views/kaminari/_paginator.html.erb:9:in_app_views_kaminari__paginator_html_erb___4026289994022119719_69904100316060'
app/views/transactions/index.html.erb:2:in `_app_views_transactions_index_html_erb__422882858554400818_60602560'
Run Code Online (Sandbox Code Playgroud)
kaminari提出了一个问题
进一步研究这里是新的Rails 5.0.0.beta1代码,现在抛出错误:

将它添加到config/application.rb'修复'它,但不是一个好主意:
config.action_controller.permit_all_parameters = true
Run Code Online (Sandbox Code Playgroud)
而是添加这个并不能解决问题,不确定原因:
config.action_controller.always_permitted_parameters = [:current_page, :page, :total_pages, :per_page, :remote, :paginator]
Run Code Online (Sandbox Code Playgroud) 我整天都被困在这一天.我有David Heinemeier Hansson工作正常的非常简单的ActionCable示例应用程序(聊天应用程序)(https://www.youtube.com/watch?v=n0WUjGkDFS0).
我试图用iPhone应用程序点击websocket连接.我连接时能够接收ping ws://localhost:3000/cable,但我不太确定如何从javascript上下文之外订阅频道.
在Rails上5.
我有一个Order带有description属性的模型.如果满足以下两个条件之一,我只想验证它的存在:如果当前步骤等于第一步或者如果require_validation等于true.
我可以根据以下一个条件轻松验证:
validates :description, presence: true, if: :first_step?
def first_step?
current_step == steps.first
end
Run Code Online (Sandbox Code Playgroud)
但我不知道如何添加另一个条件并验证其中一个是否属实.
就像是:
validates :description, presence: true, if: :first_step? || :require_validation
Run Code Online (Sandbox Code Playgroud)
谢谢!
我简直无法通过这条消息
缺少
secret_key_base'生产'环境,设置此字符串为rails credentials:edit(ArgumentError)
我这里有rails 5.2.0.跑来跑去EDITOR=vim rails credentials:edit:
production:
secret_key_base: xxxxxxxxxxxxxxxxxxxxxxx
Run Code Online (Sandbox Code Playgroud)
保存,并在终端: RAILS_ENV=production rails c
我错过了什么吗?我重新启动了服务器和同样的问题.在开发模式中没有问题.
module ApplicationCable
class Connection < ActionCable::Connection::Base
identified_by :current_user
def connect
#puts params[:auth_token]
self.current_user = find_verified_user
logger.add_tags 'ActionCable', current_user.name
end
end
end
Run Code Online (Sandbox Code Playgroud)
我不使用web作为动作电缆的终点,所以我想使用auth_token进行身份验证.默认情况下,操作电缆使用会话用户标识进行验证 如何通过params连接方法?
首先,我想简单地在我发送给我的当前对象中获取一个对象back-end.
我有这个简单的JSON(从表单生成):
{
"name": "Project 1",
"project_criteria": [
{
"name": "Criterium 1",
"type": "Type 1",
"benefit": "1"
},
{
"name": "Criterium 2",
"type": "Type 2",
"benefit": "3"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我的classes:
class Project < ApplicationRecord
has_many :project_criteria
accepts_nested_attributes_for :project_criteria
end
class ProjectCriterium < ApplicationRecord
belongs_to :project
end
Run Code Online (Sandbox Code Playgroud)
ProjectsController:
def project_params
params.require(:project).permit(:name, project_criteria: [] )
end
Run Code Online (Sandbox Code Playgroud)
但我仍然无法访问project_criteria参数,如下所示:
Started POST "/projects" for 127.0.0.1 at 2016-08-19 16:24:03 -0300
Processing by ProjectsController#create as HTML
Parameters: {"project"=>{"name"=>"Project …Run Code Online (Sandbox Code Playgroud) ActionCable在生产中不起作用.适用于开发,但不适用于生产.
在Ubuntu 14.04上使用Puma运行Nginx.我已经检查过redis-server已启动并正在运行.
Rails -v 5.0.0.1
production.log:
INFO -- : Started GET "/cable/"[non-WebSocket] for 178.213.184.193 at 2016-11-25 14:55:39 +0100
ERROR -- : Failed to upgrade to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: close, HTTP_UPGRADE: )
INFO -- : Finished "/cable/"[non-WebSocket] for 178.213.184.193 at 2016-11-25 14:55:39 +0100
Run Code Online (Sandbox Code Playgroud)
客户要求:
GET ws://mityakoval.com/cable HTTP/1.1
Host: mityakoval.com
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: http://mityakoval.com
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36
Accept-Encoding: gzip, deflate, …Run Code Online (Sandbox Code Playgroud) 我已经在一段时间内阅读了关于各种SO线程,指南等的内容......但所有答案都是矛盾和矛盾的.
似乎有很多类似的方法,很多答案都说使用不同的方法.
sanitizesanitize_conditionssanitize_sqlsanitize_sql_arraysanitize_sql_for_assignmentsanitize_sql_for_conditionssanitize_sql_hashsanitize_sql_hash_for_assignmentsanitize_sql_hash_for_conditionssanitize_sql_like我正在尝试编写一个"原始查询"适配器,它允许我运行原始的Postgres查询,但允许我插入来自危险用户输入的我自己的参数.
我不能在这几个实例中使用AR,因为我正在进行复杂的纬度/经度计算,聚合函数,复杂子查询等.
到目前为止,我尝试了两种方法:
方法1
对于这种方法,我不知道是否sanitize是上述的最佳选择,或者它是否适用于100%的情况......(我只使用Postgres)
class RawQuery
def exec(prepared, *params)
prepared = query.dup
params.flatten.each_with_index do |p, i|
prepared.gsub!("$#{i + 1}", ActiveRecord::Base.sanitize(p))
end
ActiveRecord::Base.connection.exec_query(prepared)
end
end
Run Code Online (Sandbox Code Playgroud)
琐碎的用法示例(当然通常不会这么简单,或者我只会使用AR):
RawQuery.new.exec('SELECT * FROM users WHERE name = $1', params[:name])
此外,它似乎sanitize代表quote.但根据这篇SO帖子说它只是用单引号包装东西并不安全......所以我不知道.
方法2
我不确定这是否同样安全,但它似乎使用了一个实际的PG准备功能(我假设它是100%安全的).唯一的问题是rails不会将其打印到控制台,也不包括SQL执行时间(这会破坏我的分析工具).
class RawQuery
def prepare(query, *params)
name = "raw_query_#{SecureRandom.uuid.gsub('-', '')}"
connection = ActiveRecord::Base.connection.raw_connection
connection.prepare(name, query)
connection.exec_prepared(name, params)
end
end
Run Code Online (Sandbox Code Playgroud)
使用方式相同:
RawQuery.new.prepare('SELECT * FROM …
我正在尝试将Rails应用程序部署到Heroku。自从我在那里部署任何东西已经有一段时间了,但是我对这里发生的事情一无所知。
这是一个相当基本的Rails 5应用程序。部署顺利通过Gemfile,然后失败,并出现错误,要求我安装Bundler v 2.0.1。这是日志的有趣之处:
remote: Fetching devise 4.6.2
remote: Installing sass-rails 5.0.7
remote: Installing devise 4.6.2
remote: Bundle complete! 26 Gemfile dependencies, 78 gems now installed.
remote: Gems in the groups development and test were not installed.
remote: Bundled gems are installed into `./vendor/bundle`
remote: Post-install message from i18n:
remote:
remote: HEADS UP! i18n 1.1 changed fallbacks to exclude default locale.
remote: But that may break your application.
remote:
remote: Please check your Rails app for 'config.i18n.fallbacks = true'. …Run Code Online (Sandbox Code Playgroud)我似乎无法找到任何有关如何在Rails 5中使用自定义标头提交webform的信息.我希望我发送PUT请求的URL也会收到一些自定义标头.我很惊讶form_for没有争论.
我可以通过将表单提交到我在那里修改标题的操作来完成此操作,例如,request.headers['my-header'] = 'xyz'.然后我必须PUT在这个"中间"控制器动作中提出请求,我觉得这个额外的步骤是笨重和非常规的.
我也可以使用jQuery绑定到提交点击,并在通过JavaScript添加标题后提交表单数据.在这个过程中,我宁愿不涉及另一层(即JS).
我宁愿不做.有没有办法我可以使用Rails表单助手(或一些控制器助手)为表单提交的请求添加一些自定义标头?
ruby-on-rails-5 ×10
actioncable ×3
ruby ×3
activerecord ×1
bundler ×1
heroku ×1
http-headers ×1
kaminari ×1
nginx ×1
postgresql ×1
sanitize ×1
upgrade ×1
validation ×1
webforms ×1
websocket ×1