我又仔细看了一下你的 settings 方法,你写的有点问题,不能
if @user.update_attributes(basic_params)
...
elsif @user.update_attributes(accounts_params)
...
这样写的。先不管你的 accounts,loved 那几个的更新,咱们先这看 basic_params 这一个。 你想做的是点击连接,显示更改设置的表单,然后提交表单后,进行更改操作。和 rails 常用的 edit 和 update 一样,你需要两个 action。 config/route.rb
resources :users do
member do
get :settings
post :update_settings
end
end
user_controller.rb
def settings
@user = User.find params[:id]
end
def update_settings
@user = User.find_by_id(params[:id])
if @user.update_attributes(basic_params)
redirect_to ...
else
render :settings
end
end
form_for 中的 url 也需做相应修改。
路由写错了,把你 config/route.rb 代码贴出来。
你的 users_controller 的 settings 方法即处理 get 请求,又处理 post 请求,自然会报错了。
点击 <li><%= link_to "信息修改", settings_user_path(current_user) %></li>
链接,经过路由后,到达 settings 这个 action,这时候又不是提交的表单,basic_params 函数里面的 params.require(:user) 没有 :user 参数,报错。
你的路由代码怎么得出这个的?路由代码全贴出来
settings_user GET /users/:id/settings(.:format) users#settings
POST /users/:id/settings(.:format) users#settings
出错的日志不全,全贴出来
gemstash?
search action 中 @cma 在哪赋的值?controller 的代码全贴出来
下面的 +1 就 9 个了
l = -> (x) { puts x }
l.call(1)
l.(2)
l[3]
去掉 id: false
和 t.string dept_id, null: false
create_table :depts,primary_key: :dept_id do
看文档要仔细, gets:
Returns (and assigns to $_) the next line from the list of files in ARGV (or $*)...
print:
If no arguments are given, prints $_.
对 mazt 关于 2.3 的一个采访 https://blog.heroku.com/archives/2015/12/25/ruby-2-3-0-on-heroku-with-matz
belongs_to :A, foreign_key: "XXX", primary_key: "XXX"
看文档 Options 那一节的说明
没有“似乎是因为 ruby 变量只有在第一次使用的时候才会确定它的值?依稀有这个概念,但是不太确定。”这回事。
videos = Video.where(:task_id => correct_ids)
返回一个 ActiveRecord_Relation 对象,它是 lzay 的,在使用的时候才执行查询数据库的动作。
10000+ star 了!
onclick: "return validate();" 注意后面的分号
#8 楼 @xiaoronglv key 存在 b1 和 b2 的同一个 RClass 中。object 的 c 代码如下:
struct RObject {
struct RBasic basic;
union {
struct {
long numiv; #实例变量数量
VALUE *ivptr; #存放实例变量的数组
struct st_table *iv_index_tbl; #指向类的iv_index_tbl,是一个hash,key/value分别为变量名/变量位于变量数组的index
} heap;
} as;
};
object 每次新增变量的时候,都会在 iv_index_tbl 这个 hash 中添加一个 key/value,对应变量名/index,然后 ivptr[index] 设为变量值。查找变量的时候是根据变量名找到对应的 index,从 ivptr 中取出。 代码在 variable.c 中。
struct RClass {
struct RBasic basic;
struct st_table *iv_index_tbl;
};
实例变量的名字在类里面,st_table 是个 hash。 在我看来,没有本质这种说法,只是实现的细节不同,可以用数组实现,也可以用 hash 实现。
补个创始人自己的介绍页面 http://arko.net/ 还有一期 podcast https://devchat.tv/ruby-rogues/224-rr-ruby-together-with-andr-arko
“New Company“不应该纠结语言/框架,用熟悉的那个就行,过多的考虑并发/性能问题是过早优化。
我也去
github 有一千万的用户,github.com 用的是 Rails 和 MySQL,有用 redis,关键是非常快。 技术上比较保守,没用什么高大上的技术。
#6 楼 @rei 这样写有点问题,默认的FileStore 的increment在 key 不存在的情况下是不会加 1 的。
文档:Increments an already existing integer value that is stored in the cache. If the key is not found nothing is done.
为啥不用 Rails.cache.fetch?
那篇文章作者对 fetch 的benchmark 代码在这里,我摘一部分在下面,结果 5 楼贴了。我自己也跑了一下他的代码,结果类似。对 memcached 和 redis 不是太熟,所以不知道为什么会比 FileStore 慢。
Benchmark.ips do |x|
file_store = ActiveSupport::Cache::FileStore.new("tmp/cache")
x.report(file_store.class) { file_store.fetch(rand(KEY_SIZE)) { :value } }
memory_store = ActiveSupport::Cache::MemoryStore.new
x.report(memory_store.class) { memory_store.fetch(rand(KEY_SIZE)) { :value } }
lru_redux = LruRedux::ThreadSafeCache.new(1_000)
x.report(lru_redux.class) { lru_redux.getset(rand(KEY_SIZE)) { :value } }
dc = ActiveSupport::Cache::DalliStore.new('localhost:11211')
dc.clear
begin
dc.dalli.alive!
x.report(dc.class) { dc.fetch(rand(KEY_SIZE)) { :value } }
rescue Dalli::RingError
puts "Not running Memcache bench - you must have a Memcache server available"
end
...
这个问题其实是因为你不会debug 比如用楼上的方法
def create
b = Bill.create bill_params
Rails.loger.debug "debug0: #{b.error.full_messages}"
end
controller 代码贴出来
你想显示在页面上吧?在 view(.erb) 里面,这样 <%= debug params %>
可以看看这篇。刚学的话这些不懂也没关系,用多了就懂了。
Pocket Casts,Google Play 有付费正版。AntennaPod 免费的。