2011-02-09 6 views
0

リンクを使用して、インデックスビューの1つ以上のアイテムに「アクティブ」または「非アクティブ」とマークすることができます。リンクのテキストは状態を認識する必要があります。したがって、対応する属性がfalseまたはnullの場合は「アクティブとしてマークする」、trueの場合は「非アクティブとしてマークする」がデフォルトになります。ユーザーがリンクをクリックし、コントローラーで属性が更新されると、リンクテキストは新しい状態に基づいて更新されます。railsのリスト項目に対して `update_attribute`を呼び出すと、実際にjqueryを使ってhtmlを更新できますか?

私が読んで幸せです


update.js.erb 
#how do I identify which element to update? 
$('#item[13456]').html("State aware text for link_to") 

VIEW 
- for item in @items 
    = item.name 
    = link_to "Mark as Active", item_path(item), :method => :put, :remote => true. :id => "item[#{item.id}]" 

CONTROLLER 
... 
respond_to :html, :js 
... 
def update 
    @item = Item.find(params[:id]) 
    if @item.update_attributes(params[:item]) 
    #Not sure of how to respond to .js here 
    end 
end 
... 
...私はここWAYオフですが、これは私がしようとしているコードの小さなサンプルです任意のAPI、ブログ、チュートリアルなど私はこの仕事の周りに私の手を渡すことはできません。どんな助けや指導も大歓迎です!

答えて

1

これは大まかな出発点です。

私は簡単なものから始めます。ビュー:

= link_to @item.active == true ? "yes" : "no", make_active_path(@item), :class => 'item' 

その後、彼らは我々がjQueryとAJAXでそれをターゲット項目をクリックした場合:

をこの悪いお尻の機能は自分の一番上にこれを投げるあまりにので、他のもののためにあなたのために動作しますjavascriptファイル。 :次に

jQuery.fn.submitWithAjax = function() { 
    this.live("click", function() { 
    $.ajax({type: "GET", url: $(this).attr("href"), dataType: "script"}); 
    return false; 
    }); 
}; 

あなたのjQueryのコード書き込みの残りの部分と内部この:

$(".item").submitWithAjax(); 

AJAXリクエストが自分のコントローラにオフに解雇されています

def make_active 
    @item = Item.find(params[:id]) 
    if @item.active == true 
     @item.update_attribute("active","false") 
    else 
     @item.update_attribute("active","true") 
    end 
    respond_to do |format| 
    format.js { render :action => "update", :layout => false } 
    end 
end 

その後update.jsを作ります。言い伝え:

$("#item_#{@item.id}").replaceWith("#{ escape_javascript(render :partial => 'controller/item_view', :locals => {:item_view => @item}) }"); 

それはまた、あなたがそのような親ビューの内側の部分、独自の内部の各項目を持っている必要があることを意味します。ファイルの内部

= render :partial => 'item_view', :collection => @items 

_item_view.html.haml書き込みと呼ばれる:

%div{:id => "item_#{item_view.id}"} 
    %div{:id => "post_#{post_view.id}"} 

は、することを忘れないでくださいあなたのroutes.rbにこの方法のルートを作りましょう。

+1

ありがとうございました。私はこのコードを払っており、それは私に(私が考える)成功への牽引力を与えてくれました。あなたの提案を置いた後は、必要に応じて '@ item.active'を変更しますが、リンクを更新して状態を変更することはありません。また、link_toタグに ':remote => true、:method =>:post'を追加する必要がありました。そして、私が提案したjQueryをすべて無効にしたとき、私はまったく同じ結果を得ました。私は何が欠けていますか? –

+0

@patrick、あなたはクリック時にアイコンの外観を更新しようとしていますか? – Trip

+0

ご理解いただきありがとうございます。実際には、リンクの表示テキストを更新して、 '@ item.active'の値を反映しようとしています。 –

関連する問題