我正在将pg_search添加到Rails应用程序中.我正在按照github上的说明和这个railscast,但我遇到了一个问题.
我正在建立一个多模型搜索,我有一个基本的实现工作.但是我想扩展pg_seach来使用它的英文字典.
我已经有了一个初始化程序:
PgSearch.multisearch_options = {
:using => [:tsearch,:trigram],
:ignoring => :accents
}
Run Code Online (Sandbox Code Playgroud)
所以,从我读过的内容来看,添加词典就像是一样简单
PgSearch.multisearch_options = {
:using => [:tsearch => [:dictionary => "english"],:trigram],
:ignoring => :accents
}
Run Code Online (Sandbox Code Playgroud)
但是,当我启动我的服务器
...config/initializers/pg_search.rb:2: syntax error, unexpected ']', expecting tASSOC (SyntaxError)
:using => [:tsearch => [:dictionary => "english"],:trigram],
Run Code Online (Sandbox Code Playgroud)
我已经尝试交换方括号和大括号,以及我能想到的所有其他语法排列,但没有运气.
这里的语法是什么?为什么我的尝试没有效果,因为我遵循了范围搜索的语法?
通过Devise成功登录后,如何将用户重定向回他们所在的页面?
我已经阅读和搜索了很多,我明白我需要定义after_sign_in_path_for.我已经完成了这个并且它正常工作,我遇到的问题是理解上一页的存储方式,以及如何正确调用它.
我在会话控制器中有这个:
def after_sign_in_path_for(resource)
return request.env['omniauth.origin'] || session[:user_return_to] || root_path
end
Run Code Online (Sandbox Code Playgroud)
我也试过了
...
return request.env['omniauth.origin'] || stored_location_for(resource) || root_path
...
Run Code Online (Sandbox Code Playgroud)
我不认为我理解如何存储位置,因为如果用户单击登录,则会将用户重定向回根路径.
登录可以通过两种方式启动.(a)用户尝试访问受限制的视图(即before_filter :authenticate_user!...,在这种情况下,他们被重定向并提示登录.或者(b)用户单击登录链接,如果用户未登录则在每个页面上可用.
(a)似乎有效.(b)不是.我想我需要在用户点击登录链接时将当前位置存储到会话.
我该怎么做呢?或者,哪里有一个很好的信息来源,可以帮助我理解这一点.
谢谢!
在Rails 3.2应用程序中,我有一个多态ActivtyFeed模型.
class ActivityFeed
belongs_to :user
belongs_to :feedable, polymorphic: true
end
Run Code Online (Sandbox Code Playgroud)
我需要在ActivityFeed索引视图中聚合一些项目.例如,我不想为每张照片渲染单独的项目,而是按照日期或事件对照片进行分组,并显示"用户上传的x张照片".
我的控制器看起来像这样:
@feed_items = @user.activity_feeds.sort_by(&:created_at)
@feed_array = []
photos = @feed_items.find_all{|f|f.feedable_type.eql?("Photo")}
@feed_items.delete_if{|f|f.feedable_type.eql?("Photo")}
@feed_array << @feed_items
grouped_photos = photos.group_by{|p| p.feedable.event_id}
@feed_array << grouped_photos
@feed_array.flatten!
Run Code Online (Sandbox Code Playgroud)
然后在我正在使用的视图中
if feed_array.class.eql?(Hash)
render grouped photo partial
elsif feed_array.feedable_type.eql?("Post")
render single post partial
etc
Run Code Online (Sandbox Code Playgroud)
我在按时间顺序排序项目时遇到问题,因为该数组包含嵌套哈希.
[#<ActivityFeed id: 7, user_id: 2, feedable_type: "Post", feedable_id: 3>, {2=>[#<ActivityFeed id 3, user_id: 4, feedable_type: "Photo", feedable_id: 6>]}]
Run Code Online (Sandbox Code Playgroud)
我该如何排序这个数组?
我试过@feed_array.sort{|a,b| a.['created_at'] <=> b.['created_at'] }但得到了comparison of ActivityFeed with Hash …
在Rails 3.2应用程序中,我使用简单表单来创建复杂的表单.
表单/模型accepts_nested_attributes_for,我需要获取子对象的索引.
型号:
class Project
has_many :tasks
accepts_nested_attributes_for :tasks
end
class Task
belongs_to :project
end
Run Code Online (Sandbox Code Playgroud)
表格
<%= simple_form_for @project do |f| %>
<%= f.simple_fields_for :tasks do |builder| %>
## I need to get the index of each object built via builder
<% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
我如何正确获取索引?
我通过 elasticsearch-model 和 elasticsearch-rails gems 在 Rails 应用程序中使用 Elasticsearch。
以前一切正常,但经过一些更新后,每当我尝试与远程集群(AWS Elasticsearch)交互时,我都会收到连接失败错误。
> MyModel.__elasticsearch__.create_index! force: true
=> Faraday::ConnectionFailed (execution expired)
Run Code Online (Sandbox Code Playgroud)
我正在努力找出导致此连接错误的原因。在搜索类似问题后,我调整了超时并尝试了 http、https 和裸 URL 的各种组合,但没有成功。
调试此连接错误的明智方法是什么?
我的 Elasticsearch 是这样初始化的。
#initializers/elasticsearch.rb
require 'faraday_middleware'
require 'faraday_middleware/aws_sigv4'
credentials = Aws::Credentials.new(
ENV.fetch('AWS_ACCESS_KEY_ID'),
ENV.fetch('AWS_SECRET_ACCESS_KEY')
)
config = {
url: ENV.fetch('AWS_ELASTICSEARCH_URL'),
retry_on_failure: true,
transport_options: {
request: { timeout: 10 }
}
}
client = Elasticsearch::Client.new( config ) do |f|
f.request :aws_sigv4, credentials: credentials, service: 'es', region: ENV.fetch('AWS_ELASTICSEARCH_REGION')
end
Elasticsearch::Model.client = client
Run Code Online (Sandbox Code Playgroud) 我成功打破了捆绑!我在Rails应用程序中乱搞,我做了类似的事情
bundle install string.现在我的所有宝石都被安装到应用程序中名为"string"的文件夹中.
如何重置bundler以使用我的rvm gemsets的默认路径?
这里的另一篇帖子建议使用bundle install --system,但是这会确保宝石安装到宝石中吗?
我已经检查过rvm info,GEM_HOME和GEM_PATH似乎指向正确的rvm/gemset目录.所以我很困惑为什么没有将宝石安装到正确的位置.
对不起,如果这是一个基本问题,我仍然试图了解这一切是如何工作的.谢谢你的任何指示.
在Rails 3.2应用程序中,我有一个带有文本列的模型:data.在模型中我有:
class Model
serialize :data, Hash
end
Run Code Online (Sandbox Code Playgroud)
这是以格式正确存储数据data:{"attr1"=>"foo", "attr2"=>"bar"....}.
如果我想在show视图中显示它,我可以做<%= @model.data %>,并呈现整个哈希.
但是如果我只需要渲染一个特定属性呢?这可能吗?
我尝试过几种似乎可以工作的方法:
<%= @model.data.attr1 %>- 生成undefined method 'attr1'
<%- @model.data[:attr1] %>- 不显示任何内容
我错过了什么吗?.谢谢你的任何指示
在Rails 3.2应用程序中,当某个表单无法保存(验证失败)并重定向回到表单时,我收到一个错误:
undefined method `map' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)
直接导航到新路径或编辑路径时,此表单不显示任何错误.
该错误来自具有自定义options_from_collection_for_select方法的选择字段.
<%= f.select(:user_ids, options_from_collection_for_select_with_attributes(@users, :id, :name, 'data-attributes', :attributes ), {include_blank:true}, {multiple:true}) %>
Run Code Online (Sandbox Code Playgroud)
如果我用实例变量替换@users,User.all那么重定向后我不会收到错误.
我想@users在重定向后是空的,因此错误.但为什么?@users在新的和编辑控制器中定义.
我的控制器是:
def create
--bunch of stuff
if @model.save
--bunch of stuff
respond_to do |format|
format.html { render :text => model_url(@model) }
format.html { redirect_to(@model, :notice => 'Success!.') }
format.xml { render :xml => @model, :status => :created, :location => @model }
end
else
respond_to do |format|
format.html { …Run Code Online (Sandbox Code Playgroud) 在Rails 3.2应用程序中,我有一个带有:caption字段的Photo模型,并使用Carrierwave来处理图像文件.
我正在尝试创建包含图像的原子提要.这样做的正确方法是什么?
目前我有
#views/photos/index.atom.builder
atom_feed do |feed|
feed.title "Photos"
@photos.each do |photo|
feed.entry photo do |entry|
entry.title photo.title
entry.summary photo.caption
entry.image image_path(photo.file.url(:large))
entry.author do |author|
author.name photo.user.name
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
虽然这确实在feed标记中添加了图像标记,但我认为这可能不是正确的语法?
<entry>
...
<image>http://path/to/image.jpg</image>
...
</entry>
Run Code Online (Sandbox Code Playgroud)
还有我见过以下语法的地方
<entry>
<content type="image/jpg" src="/path/to/image.png" />
</entry>
Run Code Online (Sandbox Code Playgroud)
如果有更多知识的人能告诉我,我会很感激:
给定具有 ActiveStorage 附件的模型
class MyObject
has_one_attached :avatar
end
Run Code Online (Sandbox Code Playgroud)
在开发环境中,我能够将头像检索为 StringIO 对象。
obj = MyObject.new( { valid params } )
file = File.open( Rails.root.join( "spec/support/images/test_image.jpg" ))
obj.avatar.attach( io: file, filename: "test_image.jpg" )
obj.save
version = obj.avatar.variant( resize: '200x200>').processed
version_url = Rails.application.routes.url_helpers.url_for( version )
download = open(version_url)
download.class
=> StringIO
Run Code Online (Sandbox Code Playgroud)
当我尝试在测试环境中做同样的思考时,open(version_url)返回
Errno::ECONNREFUSED Exception: Failed to open TCP connection to localhost:3000 (Connection refused - connect(2) for "localhost" port 3000)
Run Code Online (Sandbox Code Playgroud)
有没有人在测试中成功下载过 activestorage 附件?我应该如何配置测试环境来实现这一点?
我的测试环境已经有了
config.active_storage.service = :test
Rails.application.routes.default_url_options = {host: "localhost:3000"}
Run Code Online (Sandbox Code Playgroud)
我忽略了什么? …
ruby-on-rails ×10
atom-feed ×1
bundler ×1
devise ×1
pg-search ×1
rss ×1
ruby ×1
simple-form ×1