Cześć,
z ajax nie miałem nigdy do czynienia i za bardzo nie wiem jak to ugryźć obejrzałem kilka railscast ale nie rozjaśniło mi to mojego problemu.
Powiedzmy że mam dwa check_box jeden to kwiaty drugi to kolory i po zaznaczeniu kwiaty chciał bym wyświetlić rekordy z tabeli kwiaty a jak zaznaczę kolory to pobieram i wyświetlam kolorki. Przy dwóch check_box można sobie poradzić js i ukrywać któregoś z div ale przy kilku już się robi nie ciekawie.
napisałem kawałek kodu jednak nadal mi to nie działa wrzucam to co mam :
item_controller
[code] def edit
@item = Item.all
@color = Color.all
end
def update_color
@color = Color.where(item_id => params[:item_id])
render :partial => “edit_color”, :object => @color
end[/code]
item.js
update_color_div = (item_id) ->
jQuery.ajax
url: "/update_color"
type: "GET"
data: item_id: item_id
dataType: "html"
success: (data) ->
jQuery("#versionsDiv").html data
edit_item
[code] <%= select_tag “item_id”, options_from_collection_for_select(@item, “id”, “name”), :prompt => “Select a item”, :onchange => “update_color_div(this.value)” %>
<%= render :partial => 'edit_color', :object => @color %>
[/code]
_edit_color
[code]<%= select_tag "color_id", options_from_collection_for_select(@color,"id", "name"), :prompt => "Select a color" %>[/code]
routes
[code]match "/update_color" => "items#update_color"[/code]
Po wybraniu itemu nie mam dostępnych kolorów dla danego przedmiotu tylko mam wszystkie przedmioty(Wiem że da się to zrobić bez ajax ale chce się czegoś nowego nauczyć)
CHAOS, cały kod. bo z tego to figę widać,
wrzuć na githuba i daj link
@update_color_div = (item_id) ->
jQuery.ajax
url: "/update_color"
type: "GET"
data: item_id: item_id
dataType: "html"
success: (data) ->
jQuery("#versionsDiv").html data
Jeśli chcesz korzystać z funkcji update_color_div zdefiniowanej w tym pliku to musisz uczynić ją globalną w coffee wygląda to tak jak napisałem wyżej. Jednak lepiej uważać ze wszystkim co globalne. Jeśli chodzi natomiast o samą metodę ustwiającą koloroy jest mały bug
@color = Color.where(item_id => params[:item_id])
item_id powinien być symbolem czyli :tem_id
i jeszcze jeden większy problem: źle korzystasz z partiali tzn. jeśli do partiala o nazwie _edit_color.html.erb odwołujesz się w ten sposób
render :partial => "edit_color", :object => @color
to zmienna przekazana do partiala jest taka jak nazwa partiala czyli edit_color w zwiazku z tym partial powinien wyglądać tak:
<%= select_tag "color_id", options_from_collection_for_select(edit_color,"id", "name"), :prompt => "Select a color" %>
Darowałem sobie komentarze i uwagi nt. semantyczność kodu i dobych praktyk, bo jak rozumiem to poprawisz potem, a teraz chciałeś żeby cokolwiek zaczeło działać.
Wcześniej wypisywały Ci się wszystkie kolory dlatego, że w partialu korzystałeś ze zmniennej @color która w akcji edit była zainicjowana w ten sposób @color = Color.all
Podziękował ślicznie, wszystko działa.