1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

More nested polymorphic url helper fixes. Closes #6432, references #8601.

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@6960 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
Jeremy Kemper 2007-06-07 21:35:01 +00:00
parent 5600776e30
commit c7df5bd6ac
5 changed files with 92 additions and 29 deletions

View file

@ -1,6 +1,6 @@
*SVN*
* Resources: url_for([parent, child]) generates /parents/1/children/2 for the nested resource. Likewise with the other simply helpful methods like form_for and link_to. #6432 [mhw, Jonathan Vaught]
* Resources: url_for([parent, child]) generates /parents/1/children/2 for the nested resource. Likewise with the other simply helpful methods like form_for and link_to. #6432 [mhw, Jonathan Vaught, lotswholetime]
* Assume html format when rendering partials in RJS. #8076 [Rick]

View file

@ -3,7 +3,14 @@ module ActionController
def polymorphic_url(record_or_hash_or_array, options = {})
record = extract_record(record_or_hash_or_array)
args = []
args = case record_or_hash_or_array
when Hash: [record_or_hash_or_array[:id]]
when Array: record_or_hash_or_array.dup
else [record_or_hash_or_array]
end
args.pop # Remove the base record; we only need it in one case
inflection =
case
when options[:action] == "new"
@ -11,10 +18,10 @@ module ActionController
when record.respond_to?(:new_record?) && record.new_record?
:plural
else
args = [record_or_hash_or_array]
args.push(record) # Put the base record back in
:singular
end
named_route = build_named_route_call(record_or_hash_or_array, inflection, options)
send(named_route, *args)
end

View file

@ -166,13 +166,12 @@ module ActionView
when Array
object = record_or_name_or_array.last
object_name = ActionController::RecordIdentifier.singular_class_name(object)
# apply_form_for_options!(object, options, *record_or_name_or_array)
apply_form_for_options!(record_or_name_or_array, options)
args.unshift object
else
object = record_or_name_or_array
object_name = ActionController::RecordIdentifier.singular_class_name(object)
apply_form_for_options!([ object ], options)
apply_form_for_options!([object], options)
args.unshift object
end

View file

@ -0,0 +1,70 @@
require File.dirname(__FILE__) + '/../abstract_unit'
class Article
attr_reader :id
def save; @id = 1 end
def new_record?; @id.nil? end
def name
@id.nil? ? 'new post' : "post ##{@id}"
end
end
class Comment
attr_reader :id
def post_id; 1 end
def save; @id = 1 end
def new_record?; @id.nil? end
def name
@id.nil? ? 'new comment' : "comment ##{@id}"
end
end
class Comment::Nested < Comment; end
class Test::Unit::TestCase
protected
def articles_url
'http://www.example.com/articles'
end
alias_method :new_article_url, :articles_url
def article_url(article)
"http://www.example.com/articles/#{article.id}"
end
def article_comments_url(article)
"http://www.example.com/articles/#{article.id}/comments"
end
def article_comment_url(article, comment)
"http://www.example.com/articles/#{article.id}/comments/#{comment.id}"
end
end
class PolymorphicRoutesTest < Test::Unit::TestCase
include ActionController::PolymorphicRoutes
def setup
@article = Article.new
@comment = Comment.new
end
def test_with_record
assert_equal(articles_url, polymorphic_url(@article, :action => 'new'))
assert_equal(articles_url, polymorphic_url(@article))
@article.save
assert_equal(article_url(@article), polymorphic_url(@article))
end
def test_with_hash
@article.save
assert_equal(article_url(@article), polymorphic_url(:id => @article))
end
def test_with_array
assert_equal(article_comments_url(@article), polymorphic_url([@article, @comment]))
@comment.save
assert_equal(article_comment_url(@article, @comment), polymorphic_url([@article, @comment]))
end
end

View file

@ -38,6 +38,7 @@ class FormHelperTest < Test::Unit::TestCase
include ActionView::Helpers::TextHelper
include ActionView::Helpers::ActiveRecordHelper
include ActionView::Helpers::RecordIdentificationHelper
include ActionController::PolymorphicRoutes
def setup
@post = Post.new
@ -636,32 +637,18 @@ class FormHelperTest < Test::Unit::TestCase
def comments_path(post)
"/posts/#{post.id}/comments"
end
alias_method :post_comments_path, :comments_path
def comment_path(post, comment)
"/posts/#{post.id}/comments/#{comment.id}"
end
def polymorphic_path(record_or_hash_or_array)
if record_or_hash_or_array.is_a?(Array)
record = record_or_hash_or_array.pop
array = record_or_hash_or_array
else
record = record_or_hash_or_array
array = [ ]
end
if array.size > 0
if record.new_record?
"/posts/123/comments"
else
"/posts/123/comments/#{record.id}"
end
else
if record.new_record?
"/posts"
else
"/posts/#{record.id}"
end
end
alias_method :post_comment_path, :comment_path
def posts_path
"/posts"
end
def post_path(post)
"/posts/#{post.id}"
end
end