タイトルが示すように、私の主な目的は、ajax 呼び出しの後に動的な scss(.erb) ファイルをレンダリングすることです。
assets/javascripts/header.js
// onChange of a checkbox, a database boolean field should be toggled via AJAX
$( document ).ready(function() {
$('input[class=collection_cb]').change(function() {
// get the id of the item
var collection_id = $(this).parent().attr("data-collection-id");
// show a loading animation
$("#coll-loading").removeClass("vhidden");
// AJAX call
$.ajax({
type : 'PUT',
url : "/collections/" + collection_id + "/toggle",
success : function() {
// removal of loading animation, a bit delayed, as it would be too fast otherwise
setTimeout(function() {
$("#coll_loading").addClass("vhidden");
}, 300);
},
});
});
});
コントローラー/collections_controller.rb
def toggle
# safety measure to check if the user changes his collection
if current_user.id == Collection.find(params[:id]).user_id
collection = Collection.find(params[:id])
# toggle the collection
collection.toggle! :auto_add_item
else
# redirect the user to error page, alert page
end
render :nothing => true
end
データベース オブジェクトのみを切り替えると、すべてが非常にスムーズに機能しました。
ここで、いくつかのスパイスを追加li's
し、現在選択されているユーザーのコレクションに応じて 50+ の CSS を変更したいと考えました。
私の目的のCSSは次のようになります.li要素がコレクションに属しているかどうかをチェックし、そうであれば境界線の色を与えます.
ul#list > li[data-collections~='8'][data-collections~='2']
{
border-color: #ff2900;
}
これをコントローラーに追加して、次を生成しました[]-conditions
。
def toggle
# .
# .
# toggle function
# return the currently selected collection ids in the [data-collections]-format
@active_collections = ""
c_ids = current_user.collections.where(:auto_add_item => true).pluck('collections.id')
if c_ids.size != 0
c_ids.each { |id| @active_collections += "[data-collections~='#{id}']" }
end
# this is what gets retrieved
# @active_collections => [data-collections~='8'][data-collections~='2']
end
今、動的に生成される scss ファイルにこれらのブラケットを配置する方法が必要です。
追加してみました:
respond_to do |format|
format.css
end
私のコントローラーに、ファイルviews/collections/toggle.css.erbを持っています
ul#list<%= raw active_collections %> > li<%= raw active_collections %> {
border-color: #ff2900;
}
別の方法は、コントローラーから css ファイルをレンダリングし、Manuel Meurerの説明に従ってビューに渡すことでした。
ファイル名を間違えましたか?css
の代わりに使用するのが好きscss
ですか?どのように進めればよいか、何か考えはありますか?
ご協力いただきありがとうございます!
なぜ動的 CSS なのか? - 推論
これは通常、JavaScript を介してクラスを追加することで発生するはずです。動的 css が必要な理由についての私の推論は、ユーザーが選択したコレクションを変更することを決定したとき、彼はこれを非常に集中して行うということです。3 秒間に 4 回の呼び出し、5 分間の一時停止、4 秒間に 5 回の呼び出しのようなものです。li's
JavaScript は、呼び出しのたびに 50+ をループするのに時間がかかりすぎます。
アップデート
結局のところ、JavaScript は私の「長い」リストを非常に高速に処理していました...私の考えの誤りを指摘していただきありがとうございます!