有可能是网络问题,比如 Gemfile 里边的 source 是 rubygems.org,但是这个可能因为网络问题,导致你不管怎么 bundle 都会失败。但是恰巧你的电脑上的 gem source 是淘宝的,ruby.taobao.org,这个是可以用的源,所以你在执行 gem install 'xxx' 的时候就可以单独成功安装了。于是如此反复,就会出现你说的需要反复输入 gem install xxx 的情况了。
注意: 正是因为 gem 跟 Gemfile 都可以自己设置 source,所以执行 bundle install 跟 gem install 时,不一定都是从同一个源下载 gem,所以 bundle install 是否正常跟 gem install 是否正常,我觉得没太大必然关系,除非你两边都是同一个 source。
总结之,如果出现 bundle 失败,一般有几种可能原因: 1) 版本冲突,可能不同 gem 有相同依赖项,但是各自又依赖了相互冲突的两个不同版本,这个时候 bundler 无法继续往下走。这个时候的错误信息一般包含 compatible 等字眼; 2) 网络问题,可以尝试更换一个源地址,这个跟我前边的回答也比较相关; 3) 系统依赖,跟 #2 楼 @rei 提到的是一样的,一般都是缺少了本地的头文件或者可执行程序,比如 rmagick 依赖系统的 ImageMagick,mysql2 这个 gem 依赖于系统的 mysql-client-dev 头文件包,一些 PDF 处理相关的 gem 依赖 GhostScript,这个时候一般会有包含类似 Build native extension failed 之类的错误。
以上是我能想到的三种常见错误了,楼主自行再检查下吧,我估计只是网络问题。 (PS:不好好午休,扯了这么多题外话,我也真是够了,鄙视下自己)
sublime 加个 All AutoComplete 插件,可以在当前所有打开的文件内完成自动补全。
支持延期
楼上这帮坏淫们,其实我也是来等答案的
你热爱编程多过做爱
看到这行就表示呵呵了
写代码,查文档,看别人源码,然后自己发散思维,自己提问题,自己摸索解决,最后归纳总结,写成博客。
#2 楼 @xufuhaobeijing 是的,在 Ruby 中,基本所有常见的业务场景都有对应的 gem 实现,比如 验证用户的 devise,授权的 cancancan,编写 API 的 grape 等等,根本不需要自己一上来就自己写。新手推荐先从直接利用 gem 实现业务需求开始,等有一定基础之后,就推荐你删繁就简,在项目中多自己摸索或者造轮子了,这样才能成长。最后,欢迎进入 Ruby 的欢乐世界!
找个实现了分页的 gem 不就行了, will_paginate,或者 kaminari。这东西完全没必要自己写,如果非要坚持自己造轮子,至少也先看下别人是怎么实现的吧?
#3 楼 @caiqinghua 是 spree 的哪个版本呢?
http://phrogz.net/simplest-possible-ruby-web-server
ruby -run -e httpd -- -p 5000 .
想方便的话,用个 alias 不就搞定了,或者写个 shell function。
#1 楼 @caiqinghua 理论上应该不会,看这里的文档: Custom Methods
By default such validations will run every time you call
valid?
还有个问题,看你的代码不像是为了做校验,更像是一个初始化操作(在缺失 currency 的时候配置 currency 值),这样的代码建议改为 callback 更好。
说到 callback,可以检查是不是你的代码里有类似于这样的 callback 声明?
class Variant
after_initialize :check_price # after_initialize 就是在对象实例化(从数据库中读数据也是要经历这个阶段的)之后调用的 callback ,这个更符合你的业务逻辑才对
我觉得更有可能是这样的 callback 起的作用,这样也才更合理
#6 楼 @zhufengxiangxyz 大家都有自己的工作,不一定能够一直泡在论坛上的
http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-current_page-3F
<li><%= link_to "一键比对", contrast_path, class: ('active' if current_page?(contrast_path)) %></li>
#12 楼 @suffering 好的,谢谢,明白了
#9 楼 @suffering 我也一直对关系图生成比较感兴趣,请问 Graphviz 是只要你提供必要的数据,节点布局跟线条那些都是它负责的吗?开发者只需要保证输入的数据是吧?
#5 楼 @suffering 赞一个,千万不要因为造了轮子而觉得不好,要知道,不是每一个人都拥有造轮子的能力,造轮子的过程本身就是学习!
#8 楼 @geekontheway 还真不是空格问题,一旦用 code 包住就会有问题,你看:
@staffs = Staff.where(company: current_company)
@staffs = Staff.where(company_id: current_company.id)
我保证这里边没有空格,但是还是会有问题

建议自己写一个或者用其他轻量级方案,discourse 很重的,可以看 https://github.com/discourse/discourse/blob/master/docs/INSTALL.md#hardware-requirements ,光一个 discourse 就要 1GB 内存了
#46 楼 @forever139 我也去了
当然多个 class_id 字段
这个是甚么意思?没看明白。
我的设想是:
# Model
class User < ActiveRecord::Base
has_and_belongs_to_many :classes, class_name: "Klass"
has_many :messages
end
class Klass < ActiveRecord::Base
has_and_belongs_to_many :users
has_one :messages_board
#Attributes:
# binded_sub_domain => 绑定的二级域名
# checked_at => 审核通过的时间
# ... => 其他字段
end
class MessagesBoard < ActiveRecord::Base
belongs_to :class, class_name: "Klass"
has_many :messages, dependent: :destroy
end
class Message < ActiveRecord::Base
belongs_to :message_board
belongs_to :user
end
# Controller
class ApplicationController < xxxx
def retrieve_current_class_by_sub_domain
@class ||= Klass.find_by binded_sub_domain: request.subdomain # 这一行代码是示例,不保证可执行
end
end
# 权限控制,以 cancancan 为例
class Ability
include CanCan::Ability
def initialize(user)
can [:create, :read], Message, message_board: {class: user.classes} # 用户可以创建跟浏览自己班级下的留言板上的信息
# ... something else
end
end
不知道是不是能够满足你的需求
远程支持下
#19 楼 @sundevilyang 你可以联系 @leondu 或者 @justin ,需要联系方式吗?