O Rails 3 possui um JavaScript discreto, o que é bem legal.
Mas eu queria saber qual é a melhor maneira de incluir JavaScript adicional para uma página específica.
Por exemplo, onde eu poderia ter feito anteriormente:
<%= f.radio_button :rating, 'positive', :onclick => "$('some_div').show();" %>
Agora podemos torná-lo discreto com algo como
<%= f.radio_button :rating, 'positive' %>
# then in some other file
$('user_rating_positive').click(function() {
$('some_div').show();
}
Acho que minha pergunta é onde / como incluir esse JavaScript? Não quero preencher o application.js
arquivo porque esse JavaScript é aplicável apenas a essa visualização. Devo incluir um arquivo JavaScript personalizado para cada página de alguma forma ou colá-lo em uma variável de instância que o cabeçalho procura?
javascript
ruby-on-rails
ruby-on-rails-3
Brian Armstrong
fonte
fonte
Respostas:
O que eu gosto de fazer é incluir o Javascript por visualização em um
content_for :head
bloco e, em seguida,yield
nesse bloco no layout do aplicativo. Por exemploSe for bem curto, então:
ou, se mais tempo, então:
Então, no seu arquivo de layout
fonte
<%= javascript_include_tag "my_javascipt_file" %>
?Se você deseja incluir o javascript apenas em uma página, é possível incluí-lo na página, é claro, no entanto, se você deseja agrupar o seu javascript e tirar proveito do pipeline de ativos, js minificados etc., é possível fazê-lo e ter mais Recursos js que são combinados e carregados apenas em páginas específicas, dividindo seus js em grupos que se aplicam apenas a determinados controladores / visualizações / seções do site.
Mova seus js em ativos para pastas, com um arquivo de manifesto separado para cada um; portanto, se você tiver uma biblioteca js de administrador usada apenas no back-end, faça o seguinte:
no application.js existente
em um novo arquivo de manifesto admin.js.
Certifique-se de que este novo manifesto js seja carregado editando config / production.rb
Em seguida, ajuste o layout da página para incluir js extras no cabeçalho da página:
Em seguida, nas visualizações em que você deseja incluir esse grupo js específico (assim como o grupo de aplicativos normal) e / ou qualquer js, css etc. específico da página:
É claro que você pode fazer o mesmo com o css e agrupá-lo de maneira semelhante para aplicar apenas em determinadas áreas do site.
fonte
//= require_tree ./global
, mas não se eu usar o//= require_directory ./global
Rails 3.2.12.Essas respostas me ajudaram muito! Se alguém quiser um pouco mais ...
application.js.coffee
, todos os javacsripts serão carregados toda vez que você navegar para uma página diferente, e o objetivo de executar javascripts específicos da página será derrotado.Portanto, você precisa criar seu próprio arquivo de manifesto (por exemplo
speciifc.js
) que exigirá todos os arquivos javascript específicos da página. Além disso, modifiquerequire_tree
deapplication.js
app / assets / javascripts / application.js
app / assets / javascripts / specific.js
Em seguida,
environments/production.rb
adicione seu manifesto à lista pré-compilada com a opção de configuração,config.assets.precompile += %w( specific.js )
Feito! Todos os javascripts compartilhados que sempre devem ser carregados serão colocados na
app/assets/javascripts/global
pasta e os javascripts específicos da página emapp/assets/javascripts/specific
. Você pode simplesmente chamar os javascripts específicos da página na exibição, como<%= javascript_include_tag "specific/whatever.js" %>
//.js é opcional.Isso é suficiente, mas eu também queria usá
javascript_include_tag params[:controller]
-lo. Quando você cria controladores, um arquivo de café associado é geradoapp/assets/javascripts
como as outras pessoas mencionadas. Existem javascripts verdadeiramente específicos do controlador , que são carregados apenas quando o usuário atinge a visualização específica do controlador.Então eu criei outro manifesto
controller-specific.js
app / assets / javascripts / controller-specific.js
//= require_directory .
Isso incluirá todos os scripts de café gerados automaticamente associados aos controladores. Além disso, você precisa adicioná-lo à lista pré-compilada.
config.assets.precompile += %w( specific.js controller-specific.js )
fonte
javascript_include_tag params[:controller]
. Atualmente meu application.html.erb tem esta linhajavascript_include_tag 'application'
. Devo substituir isso pela outra linha?<%= javascript_include_tag "specific/whatever.js" %>
em umcontent_for :header
bloco?config.assets.precompile
. Tudo não éapp/assets/javascripts/*.js
pré-compilado automaticamente?application.css
eapplication.js
. Outros devem ser incluídos em outros arquivos ou listados usandoconfig.assets.precompile
. Leia mais aquiconfig.assets.precompile
econfig.assets.version
foi movido para config / initializers / assets.rbEu prefiro o seguinte ...
No seu arquivo application_helper.rb
e depois em sua visão específica (app / views / books / index.html.erb neste exemplo)
... Parece funcionar para mim.
fonte
Se você não deseja usar o pipeline de ativos ou as soluções complexas para obter o javascript específico da página necessário (eu simpatizo), a maneira mais simples e robusta, que obtém o mesmo que as respostas acima, mas com menos código, é apenas para: usar:
Nota: isso requer mais uma solicitação http por tag de inclusão do que as respostas que usam
content_for :head
fonte
javascript_include_tag
foi exatamente o que eu estava procurando, aplausos AJP//= require .
no application.js?//= require .
traria esse script para qualquer página do seu site, assim você teria que fazer algo como Kenny Grant (uso//= require_tree ./global
) ou bjg sugerido.//= require_tree .
para//= require_directory .
em application.js e criei um subdiretório em assets \ javascripts. Observe que você precisa incluir o novo diretório em config \ initializers \ assets.rb para pré-compilar seus js adicionando a linha:Rails.application.config.assets.precompile += %w( new_dir/js_file.js )
Dê uma olhada na jóia pluggable_js . Você pode achar esta solução mais fácil de usar.
fonte
Meu entendimento é que o pipeline de ativos visa diminuir o tempo de carregamento da página, combinando todos os seus js juntos em um arquivo (minificado). Embora isso possa parecer repugnante na superfície, é realmente um recurso que já existe em idiomas populares como C e Ruby. Coisas como tags "include" têm como objetivo impedir a inclusão múltipla de um arquivo e ajudar os programadores a organizar seu código. Quando você escreve e compila um programa em C, todo esse código está presente em todas as partes do seu programa em execução, mas os métodos só são carregados na memória quando esse código está sendo usado. Em certo sentido, um programa compilado não inclui nada para garantir que o código seja bem modular. Tornamos o código modular, escrevendo nossos programas dessa maneira, e o sistema operacional apenas carrega na memória os objetos e métodos necessários para uma determinada localidade. Existe algo como "inclusão específica de método"? Se o seu aplicativo Rails for tranquilo, é isso que você está pedindo.
Se você escrever seu javascript para aumentar o comportamento dos elementos HTML na página, essas funções serão "específicas da página" por design. Se houver algum código complicado que você tenha escrito de tal forma que seja executado independentemente do seu contexto, considere vincular esse código a um elemento html de qualquer maneira (você pode usar a tag body, conforme descrito no método Garber-Irish ). Se uma função for executada condicionalmente, o desempenho provavelmente será menor do que todas essas tags de script extras.
Estou pensando em usar a paloma gem, conforme descrito no projeto de aplicativos rails . Em seguida, você pode tornar sua página javascript específica, incluindo funções específicas da página em um retorno de chamada paloma:
Você usa trilhos, então eu sei que você ama gemas :)
fonte
Você não deve carregar seus arquivos JS ou CSS fora do pipeline de ativos, pois perde recursos importantes que tornam o Rails tão bom. E você não precisa de outra jóia. Eu acredito em usar o mínimo possível de gemas, e usar uma gema não é necessário aqui.
O que você deseja é conhecido como "Javascript Específico do Controlador" ("Javascript Específico da Ação está incluído na parte inferior). Isso permite que você carregue um arquivo JavaScript específico para um CONTROLADOR específico. Tentar conectar seu Javascript a uma Visualização é uma espécie de .." Você deseja associá-lo aos seus Controladores ou ações dentro dos seus Controladores.
Infelizmente, por qualquer motivo, os desenvolvedores do Rails decidiram que, por padrão, todas as páginas carregam todos os arquivos JS localizados no diretório de ativos. Por que eles decidiram fazer isso em vez de ativar o "Javascript específico do controlador" por padrão, nunca saberei. Isso é feito através do arquivo application.js, que inclui a seguinte linha de código por padrão:
Isso é conhecido como diretiva . É o que os sprockets usam para carregar todos os arquivos JS no diretório assets / javascripts. Por padrão, os sprockets carregam automaticamente application.js e application.css, e a diretiva require_tree carrega todos os arquivos JS e Coffee em seus respectivos diretórios.
NOTA: Quando você andaimes (se não estiver andando agora, é um bom momento para começar), o Rails gera automaticamente um arquivo de café para você, para o controlador desse andaime. Se você deseja gerar um arquivo JS padrão em vez de um arquivo de café , remova a gema de café que está ativada por padrão no seu Gemfile e seu andaime criará arquivos JS.
Ok, o primeiro passo para ativar o "Javascript específico do controlador" é remover o código require_tree do seu arquivo application.js OU alterá-lo para uma pasta no diretório assets / javascripts, se você ainda precisar de arquivos JS globais. IE:
Etapa 2: vá para o arquivo config / initializers / assets.rb e adicione o seguinte:
Insira os nomes do controlador que você deseja.
Etapa 3: Substitua o javascript_include_tag no arquivo application.html.erb por este (observe a parte params [: controller]:
Reinicie seu servidor e viola! O arquivo JS que foi gerado com o seu andaime agora será carregado somente quando esse controlador for chamado.
Precisa carregar um arquivo JS específico em uma ACTION específica no seu controlador , IE / articles / new ? Faça isso:
application.html.erb :
config / inicializadores / assets.rb :
Em seguida, inclua uma nova pasta com o mesmo nome que você controla na pasta assets / javascripts e coloque seu arquivo js com o mesmo nome da sua ação. Em seguida, ele será carregado nessa ação específica.
fonte
Ok, talvez isso seja o pior trabalho de todos os tempos, mas eu crio um método de controlador que acabou de renderizar o arquivo .js
Controlador
Visão
se por algum motivo não quisermos fazer isso, entre em contato.
fonte
A maneira preferida de adicionar JS está no rodapé, para que você possa fazer o seguinte:
show.html.erb:
layouts / application.html.erb
fonte