Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Accept a collection in fresh_when and stale? #18374

Merged
merged 1 commit into from Feb 11, 2015

Conversation

@claudiob
Copy link
Member

@claudiob claudiob commented Jan 7, 2015

The methods fresh_when and stale? from ActionController::ConditionalGet accept a single record as a short form for a hash (see docs). For instance:

  def show
    @article = Article.find(params[:id])
    fresh_when(@article)
  end

is just a short form for:

  def show
    @article = Article.find(params[:id])
    fresh_when(etag: @article, last_modified: @article.created_at)
  end

This commit extends fresh_when and stale? to also accept a collection of records, so that a short form similar to the one above can be used in an index action.
After this commit, the following code:

def index
  @article = Article.all
  fresh_when(etag: @articles, last_modified: @articles.maximum(:created_at))
end

can be simply written as:

def index
  @article = Article.all
  fresh_when(@articles)
end
@egilburg
egilburg reviewed Jan 7, 2015
View changes
actionpack/lib/action_controller/metal/conditional_get.rb Outdated
options.assert_valid_keys(:etag, :last_modified, :public, :template)
elsif record_or_collection_or_options.respond_to? :maximum
records = record_or_collection_or_options
options = { etag: records, last_modified: records.try(:maximum, :updated_at) }.merge!(additional_options)

This comment has been minimized.

@egilburg

egilburg Jan 7, 2015
Contributor

If you already check respond_to :maximum, then do you still need records.try here?

This comment has been minimized.

@claudiob

claudiob Jan 7, 2015
Author Member

@egilburg I had doubts about this too.

The reason why the code is written like that is: what if collection has a :maximum with a different arity than one? For instance:

class Collection
  def maximum
    100
  end
end

In this case, I wouldn't want an ArgumentError raised… simply caching wouldn't work.

What do you think? Would you rewrite this type of check in a different way?

This comment has been minimized.

@egilburg

egilburg Jan 7, 2015
Contributor

If a developer overrides a system method and changes the method signature, they are just asking for trouble :/

This comment has been minimized.

@egilburg

egilburg Jan 7, 2015
Contributor

Besides, try doesn't handle arity differences anyways:

'asdf'.try(:gsub)
ArgumentError: wrong number of arguments (0 for 1..2)

This comment has been minimized.

@claudiob

claudiob Jan 7, 2015
Author Member

Ok! I'll remove the try

@claudiob claudiob force-pushed the claudiob:add-collection-to-fresh-when branch 3 times, most recently Jan 7, 2015
@claudiob claudiob force-pushed the claudiob:add-collection-to-fresh-when branch Feb 9, 2015
@claudiob
Copy link
Member Author

@claudiob claudiob commented Feb 9, 2015

Good morning @rafaelfranca ☀️
Any opinion on this?

I think that's something that would help me and other developers too, since combining fresh_when and .maximum is something that I've seen in several places such as:

@arthurnn
arthurnn reviewed Feb 9, 2015
View changes
actionpack/lib/action_controller/metal/conditional_get.rb Outdated
@@ -157,8 +186,8 @@ def fresh_when(record_or_options, additional_options = {})
# super if stale? @article, template: 'widgets/show'
# end
#
def stale?(record_or_options, additional_options = {})
fresh_when(record_or_options, additional_options)
def stale?(record_or_collection_or_options, additional_options = {})

This comment has been minimized.

@arthurnn

arthurnn Feb 9, 2015
Member

record_or_collection_or_options this is getting out of hand =).
I would say this is a good opportunity to change the options passed to conditional_get to use kwargs! As far as I can tell we always validate by :etag, :last_modified, :public, :template , so those should be the args!

I also would say that refactor should happen first, and then we come back to evaluate this PR.

This comment has been minimized.

@kaspth

kaspth Feb 10, 2015
Member

@arthurnn #18872 is ready for review 😄

@arthurnn
Copy link
Member

@arthurnn arthurnn commented Feb 10, 2015

@claudiob , wanna rebase this on latest master and try again?
thanks

The methods `fresh_when` and `stale?` from ActionController::ConditionalGet
accept a single record as a short form for a hash. For instance

```ruby
  def show
    @Article = Article.find(params[:id])
    fresh_when(@Article)
  end
```

is just a short form for:

```ruby
  def show
    @Article = Article.find(params[:id])
    fresh_when(etag: @Article, last_modified: @article.created_at)
  end
```

This commit extends `fresh_when` and `stale?` to also accept a collection
of records, so that a short form similar to the one above can be used in
an `index` action. After this commit, the following code:

```ruby
def index
  @Article = Article.all
  fresh_when(etag: @articles, last_modified: @articles.maximum(:created_at))
end
```

can be simply written as:

```ruby
def index
  @Article = Article.all
  fresh_when(@articles)
end
```
@claudiob claudiob force-pushed the claudiob:add-collection-to-fresh-when branch to 050fda0 Feb 11, 2015
@claudiob
Copy link
Member Author

@claudiob claudiob commented Feb 11, 2015

@arthurnn Done… now we can review 🎀

@kaspth
Copy link
Member

@kaspth kaspth commented Feb 11, 2015

Looks good.

rafaelfranca added a commit that referenced this pull request Feb 11, 2015
Accept a collection in fresh_when and stale?
@rafaelfranca rafaelfranca merged commit e4b624a into rails:master Feb 11, 2015
1 check passed
1 check passed
continuous-integration/travis-ci The Travis CI build passed
Details
@arthurnn
Copy link
Member

@arthurnn arthurnn commented Feb 11, 2015

nice!! code looks much better now!

@claudiob claudiob deleted the claudiob:add-collection-to-fresh-when branch Feb 11, 2015
# Before
def index
@article = Article.all
fresh_when(etag: @articles, last_modified: @articles.maximum(:created_at))

This comment has been minimized.

@dhh

dhh Feb 14, 2015
Member

Shouldn't this be maximum(:updated_at)?

This comment has been minimized.

@kaspth

kaspth Feb 14, 2015
Member

Yes, it's fixed on master.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked issues

Successfully merging this pull request may close these issues.

None yet

6 participants
You can’t perform that action at this time.