1 Atualizando para o Rails 4.1
Se você está atualizando um aplicativo existente, é uma ótima ideia ter uma boa cobertura de testes antes de prosseguir. Você também deve primeiro atualizar para o Rails 4.0, caso ainda não tenha feito isso, e garantir que seu aplicativo ainda funcione conforme o esperado antes de tentar atualizar para o Rails 4.1. Uma lista de coisas a serem observadas ao atualizar está disponível no guia Atualizando o Ruby on Rails.
2 Recursos Principais
2.1 Carregador de Aplicativos Spring
O Spring é um pré-carregador de aplicativos Rails. Ele acelera o desenvolvimento mantendo seu aplicativo em execução em segundo plano, para que você não precise inicializá-lo toda vez que executar um teste, tarefa rake ou migração.
Novos aplicativos Rails 4.1 serão enviados com binstubs "springificados". Isso significa que bin/rails
e bin/rake
aproveitarão automaticamente os ambientes spring pré-carregados.
Executando tarefas rake:
$ bin/rake test:models
Executando um comando Rails:
$ bin/rails console
Introspecção do Spring:
$ bin/spring status
O Spring está em execução:
1182 spring server | my_app | iniciado há 29 minutos
3656 spring app | my_app | iniciado há 23 segundos | modo de teste
3746 spring app | my_app | iniciado há 10 segundos | modo de desenvolvimento
Dê uma olhada no README do Spring para ver todos os recursos disponíveis.
Consulte o guia Atualizando o Ruby on Rails para saber como migrar aplicativos existentes para usar esse recurso.
2.2 config/secrets.yml
O Rails 4.1 gera um novo arquivo secrets.yml
na pasta config
. Por padrão, este arquivo contém a secret_key_base
do aplicativo, mas também pode ser usado para armazenar outras informações secretas, como chaves de acesso para APIs externas.
As informações secretas adicionadas a este arquivo são acessíveis através de Rails.application.secrets
. Por exemplo, com o seguinte config/secrets.yml
:
development:
secret_key_base: 3b7cd727ee24e8444053437c36cc66c3
some_api_key: SOMEKEY
Rails.application.secrets.some_api_key
retorna SOMEKEY
no ambiente de desenvolvimento.
Consulte o guia Atualizando o Ruby on Rails para saber como migrar aplicativos existentes para usar esse recurso.
2.3 Variantes do Action Pack
Muitas vezes queremos renderizar templates HTML/JSON/XML diferentes para telefones, tablets e navegadores de desktop. As variantes facilitam isso.
A variante da requisição é uma especialização do formato da requisição, como :tablet
, :phone
ou :desktop
.
Você pode definir a variante em um before_action
:
request.variant = :tablet if request.user_agent =~ /iPad/
Responda às variantes na ação da mesma forma que responde aos formatos:
respond_to do |format|
format.html do |html|
html.tablet # renderiza app/views/projects/show.html+tablet.erb
html.phone { extra_setup; render ... }
end
end
Forneça templates separados para cada formato e variante:
app/views/projects/show.html.erb
app/views/projects/show.html+tablet.erb
app/views/projects/show.html+phone.erb
Você também pode simplificar a definição das variantes usando a sintaxe inline:
respond_to do |format|
format.js { render "trash" }
format.html.phone { redirect_to progress_path }
format.html.none { render "trash" }
end
2.4 Visualizações do Action Mailer
As visualizações do Action Mailer fornecem uma maneira de ver como os emails são exibidos visitando uma URL especial que os renderiza.
Você implementa uma classe de visualização cujos métodos retornam o objeto de email que você deseja verificar:
class NotifierPreview < ActionMailer::Preview
def welcome
Notifier.welcome(User.first)
end
end
A visualização está disponível em http://localhost:3000/rails/mailers/notifier/welcome, e uma lista delas em http://localhost:3000/rails/mailers.
Por padrão, essas classes de visualização ficam em test/mailers/previews
. Isso pode ser configurado usando a opção preview_path
.
Consulte sua documentação para obter uma descrição detalhada.
2.5 Enums do Active Record
Declare um atributo enum em que os valores são mapeados para inteiros no banco de dados, mas podem ser consultados pelo nome.
class Conversation < ActiveRecord::Base
enum status: [ :active, :archived ]
end
conversation.archived!
conversation.active? # => false
conversation.status # => "archived"
Conversation.archived # => Relação de todas as Conversations arquivadas
Conversation.statuses # => { "active" => 0, "archived" => 1 }
Consulte sua documentação para obter uma descrição detalhada.
2.6 Verificadores de Mensagens
Verificadores de mensagens podem ser usados para gerar e verificar mensagens assinadas. Isso pode ser útil para transportar com segurança dados sensíveis, como tokens de "lembrar-me" e amigos.
O método Rails.application.message_verifier
retorna um novo verificador de mensagens que assina mensagens com uma chave derivada de secret_key_base e o nome do verificador de mensagens fornecido:
```ruby
signed_token = Rails.application.message_verifier(:remember_me).generate(token)
Rails.application.message_verifier(:remember_me).verify(signed_token) # => token
Rails.application.message_verifier(:remember_me).verify(tampered_token)
raises ActiveSupport::MessageVerifier::InvalidSignature
### Module#concerning
Uma maneira natural e de baixa cerimônia de separar responsabilidades dentro de uma classe:
```ruby
class Todo < ActiveRecord::Base
concerning :EventTracking do
included do
has_many :events
end
def latest_event
# ...
end
private
def some_internal_method
# ...
end
end
end
Este exemplo é equivalente a definir um módulo EventTracking
inline,
estendendo-o com ActiveSupport::Concern
e misturando-o na classe Todo
.
Consulte sua documentação para obter uma descrição detalhada e os casos de uso pretendidos.
2.7 Proteção CSRF de tags <script>
remotas
A proteção contra falsificação de solicitação entre sites (CSRF) agora cobre solicitações GET com respostas JavaScript também. Isso impede que um site de terceiros faça referência à sua URL JavaScript e tente executá-la para extrair dados sensíveis.
Isso significa que qualquer um dos seus testes que acessam URLs .js
agora falharão na proteção CSRF, a menos que usem xhr
. Atualize seus testes para serem explícitos sobre a expectativa de XmlHttpRequests. Em vez de post :create, format: :js
, mude para o xhr :post, :create, format: :js
explícito.
3 Railties
Consulte o Changelog para obter alterações detalhadas.
3.1 Remoções
Removida a tarefa rake
update:application_controller
.Removido
Rails.application.railties.engines
obsoleto.Removido
threadsafe!
obsoleto do Rails Config.Removido
ActiveRecord::Generators::ActiveModel#update_attributes
obsoleto em favor deActiveRecord::Generators::ActiveModel#update
.Removida a opção
config.whiny_nils
obsoleta.Removidas as tarefas rake obsoletas para executar testes:
rake test:uncommitted
erake test:recent
.
3.2 Mudanças notáveis
O preloader de aplicativos Spring Spring agora é instalado por padrão para novas aplicações. Ele usa o grupo de desenvolvimento do
Gemfile
, portanto, não será instalado em produção. (Pull Request)Variável de ambiente
BACKTRACE
para mostrar backtraces não filtrados para falhas nos testes. (Commit)Exposto
MiddlewareStack#unshift
para configuração de ambiente. (Pull Request)Adicionado o método
Application#message_verifier
para retornar um verificador de mensagens. (Pull Request)O arquivo
test_help.rb
, que é exigido pelo auxiliar de teste gerado por padrão, manterá automaticamente seu banco de dados de teste atualizado comdb/schema.rb
(oudb/structure.sql
). Ele gera um erro se recarregar o esquema não resolver todas as migrações pendentes. Desative comconfig.active_record.maintain_test_schema = false
. (Pull Request)Introduza
Rails.gem_version
como um método de conveniência para retornarGem::Version.new(Rails.version)
, sugerindo uma maneira mais confiável de realizar comparação de versões. (Pull Request)
4 Action Pack
Consulte o Changelog para obter alterações detalhadas.
4.1 Remoções
Removido fallback de aplicativo Rails obsoleto para testes de integração, defina
ActionDispatch.test_app
em vez disso.Removida a configuração obsoleta
page_cache_extension
.Removido
ActionController::RecordIdentifier
obsoleto, useActionView::RecordIdentifier
em seu lugar.Removidas constantes obsoletas do Action Controller:
Removido | Sucessor |
---|---|
ActionController::AbstractRequest | ActionDispatch::Request |
ActionController::Request | ActionDispatch::Request |
ActionController::AbstractResponse | ActionDispatch::Response |
ActionController::Response | ActionDispatch::Response |
ActionController::Routing | ActionDispatch::Routing |
ActionController::Integration | ActionDispatch::Integration |
ActionController::IntegrationTest | ActionDispatch::IntegrationTest |
4.2 Mudanças notáveis
protect_from_forgery
também impede tags<script>
de origem cruzada. Atualize seus testes para usarxhr :get, :foo, format: :js
em vez deget :foo, format: :js
. (Pull Request)#url_for
recebe um hash com opções dentro de um array. (Pull Request)Adicionado o método
session#fetch
que se comporta de forma semelhante a Hash#fetch, com a exceção de que o valor retornado é sempre salvo na sessão. (Pull Request)Separou completamente o Action View do Action Pack. (Pull Request)
Registre as chaves afetadas por deep munge. (Pull Request)
Nova opção de configuração
config.action_dispatch.perform_deep_munge
para desativar "deep munging" de parâmetros que foi usado para resolver a vulnerabilidade de segurança CVE-2013-0155. (Pull Request)Nova opção de configuração
config.action_dispatch.cookies_serializer
para especificar um serializador para os jars de cookies assinados e criptografados. (Pull Requests 1, 2 / Mais Detalhes)Adicionados
render :plain
,render :html
erender :body
. (Pull Request / Mais Detalhes)
5 Action Mailer
Consulte o Changelog para obter alterações detalhadas.
5.1 Mudanças notáveis
Adicionado recurso de visualizações de mailer baseado na gem mail_view do 37 Signals. (Commit)
Instrumente a geração de mensagens do Action Mailer. O tempo necessário para gerar uma mensagem é registrado no log. (Pull Request)
6 Active Record
Consulte o Changelog para obter alterações detalhadas.
6.1 Remoções
Removido o envio de nil obsoleto para os seguintes métodos de
SchemaCache
:primary_keys
,tables
,columns
ecolumns_hash
.Removido o filtro de bloco obsoleto de
ActiveRecord::Migrator#migrate
.Removido o construtor de String obsoleto de
ActiveRecord::Migrator
.Removido o uso obsoleto de
scope
sem passar um objeto chamável.Removido
transaction_joinable=
obsoleto em favor debegin_transaction
com a opção:joinable
.Removido
decrement_open_transactions
obsoleto.Removido
increment_open_transactions
obsoleto.Removido o método
PostgreSQLAdapter#outside_transaction?
obsoleto. Agora você pode usar#transaction_open?
no lugar.Removido o método obsoleto
ActiveRecord::Fixtures.find_table_name
em favor deActiveRecord::Fixtures.default_fixture_model_name
.Removido o método
columns_for_remove
obsoleto deSchemaStatements
.Removido o método obsoleto
SchemaStatements#distinct
.Movido o
ActiveRecord::TestCase
obsoleto para o conjunto de testes do Rails. A classe não é mais pública e é usada apenas para testes internos do Rails.Removido o suporte à opção obsoleta
:restrict
para:dependent
em associações.Removido o suporte às opções obsoletas
:delete_sql
,:insert_sql
,:finder_sql
e:counter_sql
em associações.Removido o método obsoleto
type_cast_code
de Column.Removido o método obsoleto
ActiveRecord::Base#connection
. Certifique-se de acessá-lo através da classe.Removido o aviso de depreciação para
auto_explain_threshold_in_seconds
.Removida a opção obsoleta
:distinct
deRelation#count
.Removidos os métodos obsoletos
partial_updates
,partial_updates?
epartial_updates=
.Removido o método obsoleto
scoped
.Removido o método obsoleto
default_scopes?
.Removidas as referências implícitas de junção que foram obsoletas na versão 4.0.
Removida a dependência do
activerecord-deprecated_finders
. Consulte o README do gem para mais informações.Removido o uso de
implicit_readonly
. Use o métodoreadonly
explicitamente para marcar registros comoreadonly
. (Pull Request)
6.2 Depreciações
Depreciado o método
quoted_locking_column
, que não é usado em nenhum lugar.Depreciado o método
ConnectionAdapters::SchemaStatements#distinct
, pois não é mais usado internamente. (Pull Request)Depreciadas as tarefas
rake db:test:*
, pois o banco de dados de teste agora é mantido automaticamente. Consulte as notas de lançamento do railties. (Pull Request)Depreciados
ActiveRecord::Base.symbolized_base_class
eActiveRecord::Base.symbolized_sti_name
, que não têm substituição. Commit
6.3 Mudanças notáveis
- As scopes padrão não são mais substituídas por condições encadeadas.
Antes dessa mudança, quando você definia um default_scope
em um modelo, ele era substituído por condições encadeadas no mesmo campo. Agora ele é mesclado como qualquer outra scope. Mais detalhes.
Adicionado
ActiveRecord::Base.to_param
para URLs "bonitos" derivados de um atributo ou método do modelo. (Pull Request)Adicionado
ActiveRecord::Base.no_touching
, que permite ignorar o toque em modelos. (Pull Request)Unificar a conversão de tipo booleano para
MysqlAdapter
eMysql2Adapter
.type_cast
retornará1
paratrue
e0
parafalse
. (Pull Request).unscope
agora remove as condições especificadas emdefault_scope
. (Commit)Adicionado
ActiveRecord::QueryMethods#rewhere
, que sobrescreverá uma condiçãowhere
existente com nome. (Commit)Estendido
ActiveRecord::Base#cache_key
para aceitar uma lista opcional de atributos de data e hora, em que o mais alto será usado. (Commit)Adicionado
ActiveRecord::Base#enum
para declarar atributos de enumeração em que os valores são mapeados para inteiros no banco de dados, mas podem ser consultados por nome. (Commit)Converter valores JSON na gravação, para que o valor seja consistente com a leitura do banco de dados. (Pull Request)
Converter valores hstore na gravação, para que o valor seja consistente com a leitura do banco de dados. (Commit)
Tornar
next_migration_number
acessível para geradores de terceiros. (Pull Request)Chamar
update_attributes
agora lançará umArgumentError
sempre que receber um argumentonil
. Mais especificamente, lançará um erro se o argumento passado não responder astringify_keys
. (Pull Request)CollectionAssociation#first
/#last
(por exemplo,has_many
) usam uma consultaLIMIT
para buscar resultados em vez de carregar toda a coleção. (Pull Request)inspect
nas classes de modelo do Active Record não inicia uma nova conexão. Isso significa que chamarinspect
, quando o banco de dados está ausente, não lançará mais uma exceção. (Pull Request)Restrições de coluna removidas para
count
, deixando o banco de dados lançar um erro se o SQL for inválido. (Pull Request)O Rails agora detecta automaticamente associações inversas. Se você não definir a opção
:inverse_of
na associação, o Active Record adivinhará a associação inversa com base em heurísticas. (Pull Request)Lidar com atributos com alias em ActiveRecord::Relation. Ao usar chaves de símbolo, o ActiveRecord agora traduzirá nomes de atributos com alias para o nome real da coluna usado no banco de dados. (Pull Request)
O ERB nos arquivos de fixture não é mais avaliado no contexto do objeto principal. Os métodos auxiliares usados por várias fixtures devem ser definidos em módulos incluídos em
ActiveRecord::FixtureSet.context_class
. (Pull Request)Não criar ou excluir o banco de dados de teste se RAILS_ENV for especificado explicitamente. (Pull Request)
Relation
não possui mais métodos mutadores como#map!
e#delete_if
. Converta para umArray
chamando#to_a
antes de usar esses métodos. (Pull Request)find_in_batches
,find_each
,Result#each
eEnumerable#index_by
agora retornam umEnumerator
que pode calcular seu tamanho. (Pull Request)scope
,enum
e Associações agora lançam um erro em caso de conflitos de nome "perigosos". (Pull Request, Pull Request)Os métodos
second
afifth
agem como o localizadorfirst
. (Pull Request)Fazer com que
touch
acione os callbacksafter_commit
eafter_rollback
. (Pull Request)Habilitar índices parciais para
sqlite >= 3.8.0
. (Pull Request)Tornar
change_column_null
reversível. (Commit)Adicionada uma flag para desabilitar o dump do esquema após a migração. Isso é definido como
false
por padrão no ambiente de produção para novas aplicações. (Pull Request)
7 Active Model
Consulte o Changelog para obter detalhes das alterações.
7.1 Depreciações
- Depreciar
Validator#setup
. Isso agora deve ser feito manualmente no construtor do validador. (Commit)
7.2 Alterações notáveis
Adicionados novos métodos de API
reset_changes
echanges_applied
paraActiveModel::Dirty
que controlam o estado das alterações.Possibilidade de especificar vários contextos ao definir uma validação. (Pull Request)
attribute_changed?
agora aceita um hash para verificar se o atributo foi alterado:from
e/ou:to
um determinado valor. (Pull Request)
8 Active Support
Consulte o Changelog para obter detalhes das alterações.
8.1 Remoções
Removida a dependência
MultiJSON
. Como resultado,ActiveSupport::JSON.decode
não aceita mais um hash de opções paraMultiJSON
. (Pull Request / Mais detalhes)Removido suporte para o gancho
encode_json
usado para codificar objetos personalizados em JSON. Essa funcionalidade foi extraída para o activesupport-json_encoder gem. (Pull Request relacionado / Mais detalhes)Removido
ActiveSupport::JSON::Variable
depreciado sem substituição.Removidas as extensões de núcleo
String#encoding_aware?
(core_ext/string/encoding
) depreciadas.Removido
DateTime.local_offset
depreciado em favor deDateTime.civil_from_format
.Removidas as extensões de núcleo
Logger
(core_ext/logger.rb
) depreciadas.Removidos
Time#time_with_datetime_fallback
,Time#utc_time
eTime#local_time
depreciados em favor deTime#utc
eTime#local
.Removido
Hash#diff
depreciado sem substituição.Removido
Date#to_time_in_current_zone
depreciado em favor deDate#in_time_zone
.Removido
Proc#bind
depreciado sem substituição.Removidos
Array#uniq_by
eArray#uniq_by!
depreciados, useArray#uniq
eArray#uniq!
nativos em vez disso.Removido
ActiveSupport::BasicObject
, useActiveSupport::ProxyObject
em vez disso.Removido
BufferedLogger
, useActiveSupport::Logger
em vez disso.Removidos os métodos
assert_present
eassert_blank
, useassert object.blank?
eassert object.present?
em vez disso.Remover o método
#filter
depreciado para objetos de filtro, use o método correspondente em vez disso (por exemplo,#before
para um filtro antes).Removida a irregularidade de inflexão 'cow' => 'kine' do inflections padrão. (Commit)
8.2 Depreciações
Depreciados
Numeric#{ago,until,since,from_now}
, espera-se que o usuário converta explicitamente o valor em uma AS::Duration, ou seja,5.ago
=>5.seconds.ago
(Pull Request)Depreciado o caminho de require
active_support/core_ext/object/to_json
. Requeractive_support/core_ext/object/json
em vez disso. (Pull Request)Depreciado
ActiveSupport::JSON::Encoding::CircularReferenceError
. Essa funcionalidade foi extraída para o activesupport-json_encoder gem. (Pull Request / Mais detalhes)Depreciado a opção
ActiveSupport.encode_big_decimal_as_string
. Essa funcionalidade foi extraída para o activesupport-json_encoder gem. (Pull Request / Mais detalhes)Depreciar a serialização personalizada de
BigDecimal
. (Pull Request)
8.3 Alterações notáveis
O codificador JSON do
ActiveSupport
foi reescrito para aproveitar o gem JSON em vez de fazer codificação personalizada em Ruby puro. (Pull Request / Mais detalhes)Melhorada a compatibilidade com o gem JSON. (Pull Request / Mais detalhes)
Adicionados
ActiveSupport::Testing::TimeHelpers#travel
e#travel_to
. Esses métodos alteram o tempo atual para o tempo ou duração fornecidos, substituindoTime.now
eDate.today
.Adicionado
ActiveSupport::Testing::TimeHelpers#travel_back
. Este método retorna o tempo atual para o estado original, removendo as substituições adicionadas portravel
etravel_to
. (Pull Request)Adicionado
Numeric#in_milliseconds
, como1.hour.in_milliseconds
, para que possamos usá-los em funções JavaScript comogetTime()
. (Commit)Adicionados métodos
Date#middle_of_day
,DateTime#middle_of_day
eTime#middle_of_day
. Também adicionadosmidday
,noon
,at_midday
,at_noon
eat_middle_of_day
como aliases. (Pull Request)Adicionados
Date#all_week/month/quarter/year
para gerar intervalos de datas. (Pull Request)Adicionados
Time.zone.yesterday
eTime.zone.tomorrow
. (Pull Request)Adicionado
String#remove(pattern)
como uma forma abreviada do padrão comum deString#gsub(pattern,'')
. ([Commit](https://github.com/rails/rails/commit/5da23a3f921f0a4a3139495d2779ab0d3
Feedback
Você é incentivado a ajudar a melhorar a qualidade deste guia.
Por favor, contribua se encontrar algum erro de digitação ou factual. Para começar, você pode ler nossa contribuição à documentação seção.
Você também pode encontrar conteúdo incompleto ou desatualizado. Por favor, adicione qualquer documentação ausente para o principal. Certifique-se de verificar Guias Edge primeiro para verificar se os problemas já foram corrigidos ou não no branch principal. Verifique as Diretrizes dos Guias do Ruby on Rails para estilo e convenções.
Se por algum motivo você encontrar algo para corrigir, mas não puder corrigi-lo você mesmo, por favor abra uma issue.
E por último, mas não menos importante, qualquer tipo de discussão sobre a documentação do Ruby on Rails é muito bem-vinda no Fórum oficial do Ruby on Rails.