这个问题是关于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)
在这里,我做两件事:
SurveyorControllerMethodsSurveyor gem.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.所以问题是:
jquery-rails,我们甚至不必在我们的代码中包含/调用它们,然而,jQuery JavaScript文件会自动包含在内.我知道它不是魔术,所以它是如何工作的?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语法,所以我想他们只是正常功能.
所以我的问题是
everything a object & there are no primitives.作为例子,人们引用5.+(6)甚至说运营商只是简单的方法?我在很多教科书中都读过这篇文章
在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:对不起,如果这是一个愚蠢的问题
我已经完成railstutorial的第6章,但我所有的用户模型的规格开始我加入后不久失败password和password_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) 我正在使用rails 3.2并设计2.1来创建一个多站点CMS
我一直在寻找并找到一些解决方案
$ rails generate devise admin
$ rails generate devise author
$ rails generate devise subscriberRun 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)
class Admin < User; end …Run Code Online (Sandbox Code Playgroud) 我在AWS Elastic Beanstalk平台上运行我的rails应用程序,该平台运行具有Auto Scaling和Elastic Load Balancing的单个EC2实例。
我想知道如何运行resque,delayed_job或者sidekicq还是在弹性魔豆后台作业一些其他的解决方案。
Elastic Beanstalk上的后台作业可能有哪些选项?
ruby-on-rails amazon-web-services resque amazon-elastic-beanstalk
测试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) 我正在使用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) 考虑以下代码,它只打印所有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),以循环它.我需要使用范围关键字和循环.问题是:
[]string它已经是一个数组,我们可以迭代数组吗?range做了什么?for循环有什么作用?对不起,如果这个问题太愚蠢,我只是从Go开始
这是我的 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)