小编Cur*_*ind的帖子

Bundler如何工作?

这个问题是关于bundler,rubygems以及它如何确定我调用的方法.它很长,所以请耐心等待.

根据我的理解,Bundler是一个用于管理ruby的gem的依赖管理工具.它安装了所有的gems及其依赖项Gemfile.

我想问的问题可以用一个例子来说明.所以这里 - >在我的rails应用程序中,我在我的控制器中执行此操作: -

module SurveyorControllerCustomMethods
  def create
    super
  end
end
class SurveyorController < ApplicationController
   include Surveyor::SurveyorControllerMethods
end
Run Code Online (Sandbox Code Playgroud)

在这里,我做两件事:

  1. 包括SurveyorControllerMethodsSurveyor gem.
  2. 正如我在这里使用超级,它会调用create方法, SurveyorControllerMethods但是我不理解它.

宝石安装在

$ bundle show surveyor
/home/gaurish/.rvm/gems/ruby-1.9.3-p194/gems/surveyor-0.22.0
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,它不存在于红宝石中$LOAD_PATH.所以问题是:

  1. 它是如何工作的?
  2. 使用bundler安装gem,在安装过程中幕后会发生什么?
  3. 有一些宝石ex jquery-rails,我们甚至不必在我们的代码中包含/调用它们,然而,jQuery JavaScript文件会自动包含在内.我知道它不是魔术,所以它是如何工作的?

ruby rubygems ruby-on-rails bundler ruby-on-rails-3

5
推荐指数
1
解决办法
276
查看次数

ruby真的是一个完全面向对象的语言吗?

Ruby是完全面向对象的语言.在红宝石中,一切都是一个对象,因此属于某个类.例如5属于Object class

1.9.3p194 :001 > 5.class
 => Fixnum 
1.9.3p194 :002 > 5.class.superclass
 => Integer 
1.9.3p194 :003 > 5.class.superclass.superclass
 => Numeric 
1.9.3p194 :005 > 5.class.superclass.superclass.superclass
 => Object 
1.9.3p194 :006 > 5.class.superclass.superclass.superclass.superclass
 => BasicObject 
1.9.3p194 :007 > 5.class.superclass.superclass.superclass.superclass.superclass
 => nil 
Run Code Online (Sandbox Code Playgroud)

所以,我们必须通过在类前面添加类/对象名称来调用所有方法Object_name#method_name.例:

5.times{|i| puts i}
Run Code Online (Sandbox Code Playgroud)

现在,Rails有这些所谓的助手一样stylesheet_link_tag,javascript_include_tag,form_for等它不遵循这个Object_name#method_name语法,所以我想他们只是正常功能.

所以我的问题是

  1. 这些铁路助手是什么?
  2. 如果它们只是起作用而且不从任何类继承.与红宝石所说的说法相反,这并不矛盾everything a object & there are no primitives.作为例子,人们引用5.+(6)甚至说运营商只是简单的方法?

ruby ruby-on-rails ruby-on-rails-3

5
推荐指数
2
解决办法
357
查看次数

模块== mixin in ruby​​?

我在很多教科书中都读过这篇文章

在Ruby中,类只能是一个类的子类.但是,Mixins允许没有共同祖先的类共享方法.

在实践中,每当我需要实现多重继承时.我有使用Modules而不是mixins.例如:

Module name_goes_here
  def method_name_goes_here
    .....
  end
end
Run Code Online (Sandbox Code Playgroud)

然后,我只是将它们包含在一个类中

class MySubClass < MySuperClass
  include module_name
end
Run Code Online (Sandbox Code Playgroud)

现在,我已经提到了多个ruby书籍,每个人都在讨论mixins然后突然间,所有人都开始谈论模块,而没有说明mixins和模块的关系是什么.

所以,问题是:在ruby中模块是== mixins吗?如果是,那么为什么.如果没有,那有什么区别?

PS:对不起,如果这是一个愚蠢的问题

ruby

5
推荐指数
2
解决办法
524
查看次数

railstutorial.org,第6章.未知属性:密码

我已经完成railstutorial的第6章,但我所有的用户模型的规格开始我加入后不久失败passwordpassword_confirmation与以下错误:

Failures:

  1) User 
     Failure/Error: @user = User.new(name: "Example User", email: "user@example.com",
     ActiveRecord::UnknownAttributeError:
       unknown attribute: password
     # ./spec/models/user_spec.rb:17:in `new'
     # ./spec/models/user_spec.rb:17:in `block (2 levels) in <top (required)>'

  2) User 
     Failure/Error: @user = User.new(name: "Example User", email: "user@example.com",
     ActiveRecord::UnknownAttributeError:
       unknown attribute: password
     # ./spec/models/user_spec.rb:17:in `new'
     # ./spec/models/user_spec.rb:17:in `block (2 levels) in <top (required)>'

  3) User 
     Failure/Error: @user = User.new(name: "Example User", email: "user@example.com",
     ActiveRecord::UnknownAttributeError:
       unknown attribute: password
     # ./spec/models/user_spec.rb:17:in `new'
     # ./spec/models/user_spec.rb:17:in `block …
Run Code Online (Sandbox Code Playgroud)

tdd rspec ruby-on-rails ruby-on-rails-3 railstutorial.org

5
推荐指数
2
解决办法
7699
查看次数

设计多种模型和多种登录表单

我正在使用rails 3.2并设计2.1来创建一个多站点CMS

要求

  • 基于Basecamp子域的站点.
  • 有3个"用户"型号.1.管理员(超级用户)2.作者(每个子域都有自己的站点)和订阅者(​​阅读站点).
  • 作者:注册是普通的用户名/密码组合,但需要得到管理员的批准.他们的注册表格将有子域名.
  • 订阅者:通过邀请电子邮件进行注册.
  • 需要单独的登录和注册表格

可能的解决方案

我一直在寻找并找到一些解决方案

  • 3设计中的独立模型:
$ rails generate devise admin 
$ rails generate devise author
$ rails generate devise subscriber
Run Code Online (Sandbox Code Playgroud)

但是这会产生以下错误

$ rails generate devise author /home/gaurish/.rvm/gems/ruby-1.9.3-p286-perf/gems/devise-2.1.2/lib/devise/rails/routes.rb:443:in 'raise_no_devise_method_error!': Admin does not respond to 'devise' method. This usually means you haven't loaded your ORM file or it's being loaded too late. To fix it, be sure to require 'devise/orm/YOUR_ORM' inside 'config/initializers/devise.rb' or before your application definition in 'config/application.rb' (RuntimeError)

  • STI:数据库中的单个表,并为每个用户类型创建一个模型

     class Admin < User; end …
Run Code Online (Sandbox Code Playgroud)

authentication ruby-on-rails devise ruby-on-rails-3

5
推荐指数
1
解决办法
5507
查看次数

如何在AWS Elastic Beanstalk上使用Resque运行Rails后台作业?

我在AWS Elastic Beanstalk平台上运行我的rails应用程序,该平台运行具有Auto Scaling和Elastic Load Balancing的单个EC2实例。

我想知道如何运行resquedelayed_job或者sidekicq还是在弹性魔豆后台作业一些其他的解决方案。

Elastic Beanstalk上的后台作业可能有哪些选项?

ruby-on-rails amazon-web-services resque amazon-elastic-beanstalk

5
推荐指数
1
解决办法
3110
查看次数

Rails 4 force_ssl问题?

测试Rails 4.在Rails 3中,将force_ssl放在我的控制器顶部强制ssl仅用于生产.这被忽略了开发,这是我想要的行为,并且符合force_ssl的文档.

在Rails 4中,我发现force_ssl强制ssl甚至用于开发,这不是我想要的行为(易于解决,但需要更多我不想要的代码).此外,我无法在任何发行说明中找到所谓的更改位置,因此我认为它可能是一个错误.

我无法通过谷歌搜索找到关于此的错误报告,也无法在本网站上找到.其他人可以确认吗?此外,如果是这样,有人可以将错误报告提交给Rails(我没有设置这样做的帐户,并且如果其他人已经拥有帐户,则不想创建一个帐户).

简单的解决方法,顺便说一下:

Rails.env.production? ? force_ssl : nil
Run Code Online (Sandbox Code Playgroud)

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

5
推荐指数
1
解决办法
3890
查看次数

devise_invitable:仅允许管理员邀请用户

我正在使用devise_invitablegem在我的应用程序中启用邀请以及设计rails 3应用程序.我有一个User&Profile模型.在User,有一个role列给出了用户类型.

现在,我想限制创建新邀请的功能仅限于管理员通过确定这个范围路线到devise/invitations#new哪里user.role=='admin'和打开其他人的路线.这样的事情

MyApp::Application.routes.draw do

devise_for :users, skip: [:registrations, :invitations]

as :user do
 get 'users/edit' => 'devise/registrations#edit', as: 'edit_user_registration'
  put 'users' => 'devise/registrations#update', as: 'user_registration'

# manually define alll devise_invitable routes, except devise/invitations#new

# accept_user_invitation GET /users/invitation/accept(.:format) devise/invitations#edit

# user_invitation POST /users/invitation(.:format) devise/invitations#create

# also the #accept route goes here

end



resource :profile, except: :destroy

authenticated :user, lambda {|u| u.role == "admin"} do

resources …
Run Code Online (Sandbox Code Playgroud)

routes ruby-on-rails devise devise-invitable

4
推荐指数
2
解决办法
4660
查看次数

go中for循环结构与范围关键字的区别

考虑以下代码,它只打印所有ENV变量

package main

import (
    "fmt"
    "os"
)

func main() {
    for i, env := range os.Environ() {
        fmt.Println(i, env)
    }
}
Run Code Online (Sandbox Code Playgroud)

这里,os.Environ()应该返回字符串数组([] string),以循环它.我需要使用范围关键字和循环.问题是:

  1. 为什么要求和范围都需要?是否可以使用for循环,因为[]string它已经是一个数组,我们可以迭代数组吗?
  2. 在上面的代码中range做了什么?for循环有什么作用?

对不起,如果这个问题太愚蠢,我只是从Go开始

go

4
推荐指数
1
解决办法
1205
查看次数

在 Docker 的供应商/缓存中使用供应商的 gem

这是我的 docker 文件,它可以工作:

FROM ruby:2.6.6
WORKDIR /home/app/webapp
COPY . /home/app/webapp/
RUN bundle install
# Start the main process.
CMD ['/home/app/webapp/entrypoint.sh']
Run Code Online (Sandbox Code Playgroud)

这工作正常,但每次都会捆绑安装!相反,我将所有 gems 供应商直接放在 git 源本身的 /vendor/cache 中。

$ ls vendor/cache
<..snip long list.>
rake-13.0.1.gem
rails-5.2.4.1.gem
rails-controller-testing-1.0.4.gem
rails-dom-testing-2.0.3.gem
rails-html-sanitizer-1.3.0.gem
rails-i18n-5.1.3.gem
rails-ujs-0.1.0.gem
sass-rails-5.0.8.gem
sprockets-rails-3.2.1.gem
<..snip long list.>
Run Code Online (Sandbox Code Playgroud)

根据捆绑器文档: https: //bundler.io/bundle_install.html,这应该像它所说的那样工作:

安装 gems 时,Bundler 将检查供应商/缓存,然后检查系统的 gems。如果 gem 未缓存或安装,Bundler 将尝试从您在 Gemfile 中声明的源安装它。

当我在没有 docker 的情况下在 mac 上捆绑时,这确实有效,如下所示:

$ bundle 
Using rake 13.0.1
Using rails 5.2.4.1
Using rails-controller-testing 1.0.4
Using rails-i18n 5.1.3
Using rails-ujs …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails bundler docker dockerfile

4
推荐指数
1
解决办法
3361
查看次数