Tag: ruby on rails 5

从Rails插件向Rails引擎模型添加方法

我正在编写一个Rails插件来扩展Rails引擎。 即MyPlugin将MyEngine作为依赖项。 在我的Rails引擎上,我有一个MyEngine::Foo模型。 我想为这个模型添加新方法,所以我在我的插件app/models/my_engine/foo.rb创建了一个文件,其中包含以下代码: module MyEngine class Foo def sayhi puts “hi” end end end 如果我在插件虚拟应用程序上进入Rails控制台,我可以找到MyEngine::Foo ,但运行MyEngine::Foo.new.sayhi返回 NoMethodError:未定义的方法`sayhi’ 为什么MyPlugin无法看到MyEngine::Foo模型的更新? 我哪里错了?

设计:如果没有用户,则重定向以注册页面而不是登录

如果没有用户在场,我希望将请求重定向到“注册”页面而不是“登录”页面。 所以,为此,我重写了authenticate_user! 应用程序控制器中的方法: class ApplicationController < ActionController::Base protect_from_forgery with: :exception before_action :authenticate_user! protected def authenticate_user! redirect_to new_user_registration_path unless User.any? end end 这里的问题是页面没有正确重定向。 该请求将被无限期地重定向到注册页面,即请求未完成。 在rails服务器控制台上显示: Filter chain halted as :authenticate_user! rendered or redirected Completed 302 Found in 0ms (ActiveRecord: 0.0ms)

通过以下方式进行多对多:从Associations :: CollectionProxy到AssociationRelation

通过与客户关系密切的客户关系(通过favorites.rb)我有多对多的关系,我想知道如何将CollectionProxy转换为AssociationRelation,这样我就可以获得与用户最喜欢的所有客户的关系。 或者只是简单地说,如何在AssociationRelation中获取它们 – 不必从CollectionProxy转换。 编辑:我正在寻找的只是一个列出所有客户的关系。 我意识到我的问题不同。 我如何与所有客户建立关系? – 不是与favorite_id,user_id等的关系 – 我想要一个纯粹与客户及其行的关系。 我可以像这样找到CollectionProxy: user = User.last user.favorites # Gives me a CollectionProxy 但是我如何找到最喜欢的客户作为AssociationRelation? 楷模: user.rb: has_many :favorites, :dependent => :destroy has_many :clients, through: ‘favorites’ Client.rb has_many :favorites, :dependent => :destroy has_many :users, through: ‘favorites’ Favorite.rb belongs_to :user belongs_to :client

Sass rails似乎生成了与manifest中不同的逻辑路径

到目前为止,我的生产资产没有任何问题,尽管Heroku在以下情况下抛出错误: config.assets.compile = true 然后我决定在本地进行预编译并更改以上内容: config.assets.compile = false config.serve_static_assets = true 当我使用Rails助手来揭示资产的路径时,它现在可以正常工作: style=”background-image: url(”);” 以上在生产中效果很好,它选择了资产的指纹版本。 虽然我遇到了SASS RAILS的问题,但实际上可以做同样的事情,而不必编写一些Ruby。 例如,以下资产未在生产中进行指纹识别,并且未选择字体: @font-face { font-family: “Myfont”; src: asset-url(“Myfont.ttf”) format(“truetype”); } 生产中生成的CSS: @font-face{ font-family:”Myfont”; src:url(“/assets/Myfont.ttf”) format(“truetype”) } 正如您所见,没有指向指纹资产的链接。 SASS助手似乎正确地完成了这项工作: https : //github.com/rails/sass-rails#asset-helpers 虽然我的sprockets清单文件在公共文件夹中显示: Myfont-03a09f05dd555ee8b78d16411003a2e35f4322c05807f63db0039d23f71225a2.ttf”: {“logical_path”:”Myfont.ttf”, “mtime”:”2018-04-13T22:40:09+02:00″, “size”:7916, “digest”:”03a09f05dd555ee8b78d16411003a2e35f4322c05807f63db0039d23f71225a2″, “integrity”:”sha256-A6CfBd1VXui3jRZBEAOi419DIsBYB/Y9sAOdI/cSJaI=”} 清单中的逻辑路径与SASS RAILS帮助程序生成的路径不同。 有没有办法来解决这个问题 ?

具有多个Devise模型的Actioncable身份validation

我目前正在实现两个Devise模型之间的聊天。 Client和Professionnel 。 目前工作正常,但我只有一个渠道:每个客户或专业人员都会收到来自所有客户和所有专业人士的所有消息。 显示很好,但是观看他们的AJAX流的人可以看到每个不适合他们的私人消息。 根据这个主题http://www.thegreatcodeadventure.com/rails-5-action-cable-with-multiple-chatroom-subscriptions/这被称为单一责任原则 所以我试图创建“子流”,以便向正确的用户广播。 我的第一步是使用Devise进行authing。 我正在使用经典: module ApplicationCable class Connection < ActionCable::Connection::Base identified_by :current_user def connect self.current_user = find_verified_user logger.add_tags 'ActionCable', current_user.email end protected def find_verified_user if verified_user = env['warden'].user verified_user else reject_unauthorized_connection end end end end 这就是出现问题的地方:当客户端登录时,Actioncable不会创建连接: Started GET “/cable” for 127.0.0.1 at 2018-04-16 22:30:28 +0200 Started GET “/cable/” [WebSocket] for […]

为什么我的生产Rails服务器不能解析常量?

我们刚刚更新到Rails 5。 现在所有测试都通过 我能够启动一个Web服务器,一切似乎都有效。 但是在生产服务器上,有些URL会出现如下错误: uninitialized constant #::JsonUtils app/models/thing.rb:71:in `as_json’ JsonUtils位于app/lib/json_utils.rb 。 (当lib从过去的自动加载路径中取出时,我们将它们移动到了app/lib 。) 如果我运行bin/rails console development ,实际上,即使我运行bin/rails console production ,我也可以输入JsonUtils并解析它。 然而,当应用程序正在运行时,此类无法解析。 有没有人见过这样的东西?

未定义的方法或我的Active Record错误

对不起,如果我的问题很愚蠢,但Rails对我来说是新的。 我制作了两个型号和两个控制器。 在我制作了第二个模型并添加了第一个模型后,我的问题就开始了。 class SentencesController < ApplicationController before_action :find_story def create @sentence = find_story.sentences.build(sentence_params) if @sentence.save flash[:success] = "You wrote the continuation!" render 'stories/show' else render 'stories/show' end end private def sentence_params params.require(:sentence).permit(:content) end def find_story @story = Story.find(params[:id]) end end 还有这个: class StoriesController < ApplicationController …….. def show @story = Story.find(params[:id]) @sentence = @story.sentences.build […]

Rails嵌套属性不使用carrierwave保存

我可以通过下面的服务器日志显示插入的库属性,但图片属性也不会插入。 服务器响应 Started POST “/galleries” for 127.0.0.1 at 2017-05-13 18:19:23 +1000 Processing by GalleriesController#create as HTML Parameters: {“utf8″=>”✓”, “authenticity_token”=>”LACaMz44B9mn/psLYjzs8qrwo9mr0l2OEIPg+VmCn9CdbGhBh9rDUJ6FE0EOwKCj7aZVjbM4+t0YoaFIRX7IEA==”, “gallery”=>{“name”=>”Hello”, “cover”=>”123456”, “picture”=>{“picture”=>#<ActionDispatch::Http::UploadedFile:0xb943d50 @tempfile=#, @original_filename=”Skateboard 1.jpg”, @content_type=”image/jpeg”, @headers=”Content-Disposition: form-data; name=\”gallery[picture][picture]\”; filename=\”Skateboard 1.jpg\”\r\nContent-Type: image/jpeg\r\n”>}}, “commit”=>”Create Gallery”} Unpermitted parameter: picture (0.0ms) begin transaction SQL (1.0ms) INSERT INTO “galleries” (“name”, “cover”, “created_at”, “updated_at”) VALUES (?, ?, ?, ?) [[“name”, […]

注册后基于导航的重定向

我的网站允许用户自由浏览到需要登录的位置以继续使用该服务(点击“注册”按钮并完成注册过程)。 一旦用户注册,我想将它们重定向到他们正在浏览的最后一个有趣页面:它可能是点击注册按钮之前的页面,或更复杂的页面。 例如,假设用户浏览“核心”内容页面,然后转到“about_us”页面,然后尝试注册,我宁愿将这些用户重定向到“核心”内容页面。 我想知道最好的方法是什么 表格中隐藏的参数? 在整个表单中跟踪此参数听起来很烦人(并在出现错误时保留它等) 基于会话的信息(某种“智能推荐人”url) 页面访问(例如,使用Ahoy.js) 在哪里/何时对最后一个相关页面进行“跟踪”? 在控制器? 在视图中作为JS代码? 做这样的事情的任何提示?

如果关联具有limit子句,则AssociationRelation属性上的Rails sum不正确

我有一个方法可以计算模型中许多浮点属性的统计数据(主要是总和)。 模特 class GroupPlayer < ActiveRecord::Base belongs_to :group has_many :scored_rounds has_many :rounds, dependent: :destroy end class Round < ActiveRecord::Base belongs_to :group_player end class ScoredRound < Round # STI end 提供最多4个浮点属性的统计信息的方法,这些属性是从其他方法调用的,具体取决于我是否获得了一个玩家或一组玩家的统计数据。 ScoredRound上的初始filter传递给方法(sr) def method_stats(method,sr,grp) rounds = sr.where.not(method => nil) number_rounds = rounds.count won = rounds.sum(method).round(2) if method == :quality dues = grp.options[:dues] * number_rounds else dues […]