我正在尝试使用以下内容:
class PaymentsController < ApplicationController
def addproduct
(session[:products] ||= []) << params[:item]
redirect_to :back
end
end
Run Code Online (Sandbox Code Playgroud)
我有这个例外:
undefined method `back_url' for #<PaymentsController:0x007ff682c467a8>
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
1.9.3p194 :002 > u = User.find_by_email("email@mail.ru")
1.9.3p194 :005 > u.addresses.size
=> 1
1.9.3p194 :006 > u.addresses.length
=> 1
1.9.3p194 :007 > u.addresses.count
Run Code Online (Sandbox Code Playgroud)
Rails 3.2.3中的大小,长度和计数没有区别,不是吗?
我可以通过将声明放在一个部分中来使attr_reader
(和相关的attr_writer
和attr_accessor
)方法私有化private
:
class Foo
private
attr_reader :b
end
Foo.new.b # => NoMethodError: private method `b' called for #<Foo:>
Run Code Online (Sandbox Code Playgroud)
但是,Rails' delegate
和Ruby标准库def_delegate
不能以这种方式工作.这些委托方法始终是公开的.
class Foo
attr_reader :b
def initialize
@b = 'b'
end
end
require 'forwardable'
class Bar
attr_reader :foo
def initialize
@foo = Foo.new
end
extend Forwardable
private
def_delegator :foo, :b
end
Bar.new.b # => "b"
Run Code Online (Sandbox Code Playgroud)
通过将委托更改为以下内容,可以轻松完成委托授权:
private def_delegator :foo, :b
Run Code Online (Sandbox Code Playgroud)
但我预计会NoMethodError
出现Bar.new.b
上述错误.为什么代表团不私有?
def_delegator
(别名for def_instance_delegator
)的方法定义就是rescue
(删除了块): …
看到这个简单的Ruby类:
require 'byebug'
class Foo
def run
byebug
puts defined?(bar)
puts bar.inspect
bar = 'local string'
puts defined?(bar)
puts bar.inspect
end
def bar
'string from method'
end
end
Foo.new.run
Run Code Online (Sandbox Code Playgroud)
运行此类时,可以在调试器的控制台中观察到以下行为:
$ ruby byebug.rb
[2, 11] in /../test.rb
2:
3: class Foo
4: def run
5: byebug
6:
=> 7: puts defined?(bar)
8: puts bar.inspect
9:
10: bar = 'local string'
11:
Run Code Online (Sandbox Code Playgroud)
在断点处,调试器返回以下值:
(byebug) defined?(bar)
"local-variable"
(byebug) bar.inspect
"nil"
Run Code Online (Sandbox Code Playgroud)
请注意 - 尽管调试器的断点符合要求#5
- 它已经知道将bar
在行#10
中定义一个局部变量,该局部变量将影响该方法bar
,并且调试器实际上不再能够调用该 …
最近我更新了我的rails版本4.2.3
和ruby版本 ruby-2.2.3
.在我捆绑之后,它会出现以下错误:
$ bundle
Fetching gem metadata from http://rubygems.org/..........
Fetching version metadata from http://rubygems.org/...
Fetching dependency metadata from http://rubygems.org/..
Could not find celluloid-0.16.1 in any of the sources
Run Code Online (Sandbox Code Playgroud)
你可以帮帮我吗?
为了处理Rails异常,我看到人们"提出SomeException.new"或"提出SomeException",有什么区别?
如果我有课,请说
class UnableToCreateShipments < StandardError; end
Run Code Online (Sandbox Code Playgroud)
我可以两个都做吗?
raise UnableToCreateShipments
raise UnableToCreateShipments.new
Run Code Online (Sandbox Code Playgroud)
或者留言
raise UnableToCreateShipments, 'my error message'
raise UnableToCreateShipments.new('my error message')
Run Code Online (Sandbox Code Playgroud) 我是Ruby的新手.我正在学习ruby中的抽象原理.我理解过程抽象是隐藏用户的实现细节,或者只是专注于基本要素而忽略细节.
我关心的是如何实现它
1)这是一个简单的函数调用就像这样
# function to sort array
# @params array[Array] to be sort
def my_sort(array)
return array if array.size <= 1
swapped = false
while !swapped
swapped = false
0.upto(array.size-2) do |i|
if array[i] > array[i+1]
array[i], array[i+1] = array[i+1], array[i]
swapped = true
end
end
end
array
end
Run Code Online (Sandbox Code Playgroud)
并且这样打电话
sorted_array = my_sort([12,34,123,43,90,1])
Run Code Online (Sandbox Code Playgroud)
2)数据抽象与封装有何不同
据我所知,Data Abstraction只是隐藏了其他类的一些成员数据.
我是 ruby on Rails 的新手。我的错误是
NameError in ReviewsController#create
uninitialized constant User::Review
Extracted source:
@review = current_user.reviews.build(review_params)
Run Code Online (Sandbox Code Playgroud)
我在其他堆栈溢出问题上读到,通常是错误名称或忘记belongs_to或has_many的错误,但我相信我已经正确设置了关系。我正在使用 gem 设备来处理用户并登录/注册等
评论.rb
class Reviews < ActiveRecord::Base
belongs_to :user
belongs_to :renters
end
Run Code Online (Sandbox Code Playgroud)
用户.rb
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :reviews
end
Run Code Online (Sandbox Code Playgroud)
评论_Controller.rb
class ReviewsController < ApplicationController
before_action :set_renter
before_action :authenticate_user!
def new
@review = Reviews.new(renters: @renter)
end
def create
@review = current_user.reviews.build(review_params)
@review.renter = @renter
@review.save
redirect_to @renter
end
private
def set_renter
@renter = Renters.find(params[:renter_id])
end
def …
Run Code Online (Sandbox Code Playgroud) 我观察了一个奇怪的split
方法行为String
.
"1..2".split('..') # => ['1', '2']
"1..2".split('..', 2) # => ['1', '2']
"..2".split('..') # => ['', '2']
"..2".split('..', 2) # => ['', '2']
Run Code Online (Sandbox Code Playgroud)
一切都像预期,但现在:
"1..".split('..') # => ['1']
"1..".split('..', 2) # => ['1', '']
Run Code Online (Sandbox Code Playgroud)
我希望第一个与第二个相同.
有没有人有一个很好的解释,为什么只"1..".split('..')
返回一个只有一个元素的数组?或者它是Ruby的不一致?你觉得怎么样?
我怎么能纠正这个"i18n需要Ruby版本> = 1.9.3"我在运行"bundler install"时得到了什么?
背景:需要在dreamhost上使用ruby 1.8.7,因此针对此确定了Rails v3.2.
命令行
Gregs-MacBook-Pro:weekends Greg$ ruby -v
ruby 1.8.7 (2013-12-22 patchlevel 375) [i686-darwin14.1.0]
Gregs-MacBook-Pro:weekends Greg$ bundler -v
Bundler version 1.9.2
Gregs-MacBook-Pro:weekends Greg$ bundler install
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Resolving dependencies............
Using rake 10.4.2
Gem::InstallError: i18n requires Ruby version >= 1.9.3.
An error occurred while installing i18n (0.7.0), and Bundler cannot continue.
Make sure that `gem install i18n -v '0.7.0'` succeeds before bundling.
Gregs-MacBook-Pro:weekends Greg$ …
Run Code Online (Sandbox Code Playgroud)