【发布时间】:2011-06-02 21:32:55
【问题描述】:
好的,所以我正在开发我的第一个单独的 Rails 应用程序,一个 URL 缩短器,我已经把自己搞糊涂了。在我的模型中,我使用 domain 和 key 属性存储了一个短 URL。这是我的模型:
# == Schema Information
# Schema version: 20110601022424
#
# Table name: shorteners
#
# id :integer not null, primary key
# url :string(255)
# key :string(255)
# created_at :datetime
# updated_at :datetime
# domain :string(255)
#
class Shortener < ActiveRecord::Base
attr_accessible :url
validates :url, :presence => true, :uniqueness => true, :uri_format => true
before_save :set_autogenerated_info
def shortlink
"http://#{domain}/#{key}"
end
private
def set_autogenerated_info
return unless new_record? #This only gets set one time
domain = get_random_domain
key = get_next_key(domain)
write_attribute(:domain, domain)
write_attribute(:key, key)
end
def get_random_domain
#commented out magic to grab random domain from pool
end
def get_next_key(domain)
#commented out magic to generate next unique key
end
end
我目前的方法似乎在我的 controller_spec 中弄乱了这个测试用例:
require 'spec_helper'
describe ShortenersController do
render_views
describe "GET show" do
before(:each) do
@shortener = Factory(:shortener)
end
it "should find the right shortener" do
get :show, :id => @shortener
assigns(:shortener).should == @shortener
end
end
end
它给了我这个错误信息:
Failures:
1) ShortenersController GET show should find the right shortener
Failure/Error: get :show, :id => @shortener
ActionView::Template::Error:
undefined local variable or method `domain' for #<Shortener:0x00000004a04548>
# ./app/models/shortener.rb:25:in `shortlink'
# ./app/views/shorteners/show.html.erb:10:in `_app_views_shorteners_show_html_erb___556550686459204284_38799300_3170414004415921977'
# ./spec/controllers/shorteners_controller_spec.rb:32:in `block (3 levels) in <top (required)>'
我可以通过在attr_accessible 行上方添加这个来通过测试用例:
attr_reader :domain, :key
但这会做一些非常疯狂的事情,比如不在我的应用程序视图中显示域/键属性,甚至不让我直接从我的 Rails 控制台中的模型访问它们:
Loading development environment (Rails 3.0.7)
>> s = Shortener.new(:url => 'http://www.stackoverflow.com')
=> #<Shortener id: nil, url: "http://www.stackoverflow.com", key: nil, created_at: nil, updated_at: nil, domain: nil>
>> s.save
=> true
>> s
=> #<Shortener id: 12, url: "http://www.stackoverflow.com", key: l, created_at: "2011-06-02 16:35:01", updated_at: "2011-06-02 16:35:01", domain: "localhost">
>> s.domain
=> nil
>> s.key
=> nil
>> s.shortlink
=> "http:///"
更新 - 添加视图:
<p id="notice"><%= notice %></p>
<p>
<b>Url:</b>
<%= @shortener.url %>
</p>
<p>
<b>Shortened Link:</b>
<a href="<%= @shortener.shortlink %>"><%= @shortener.shortlink %></a>
</p>
<%= link_to 'Edit', edit_shortener_path(@shortener) %> |
<%= link_to 'Back', shorteners_path %>
【问题讨论】:
-
请一次只问一个问题
-
完成。抱歉,我确实想过把它们分开,但不想重新解释一大堆东西。
-
你如何定义
domain第25行? -
你能发表你的看法吗?或者至少是第 10 行附近的部分?
-
此外,还有一些快速建议——将
before_save更改为before_create——然后你就可以去掉set_autogenerated_info中对new_record?的检查。此外,在您的模型中使用该方法是完全合法的,并且可能是它的最佳位置。
标签: ruby-on-rails ruby ruby-on-rails-3 rspec rails-activerecord