link_to i konkretna akcja z kontrolera

Mam problem z wykonaniem następującej rzeczy. Posiadam tabele Question gdzie jest pole “open” typu boolean, teraz chciałbym aby użytkownik miał możliwość zmiany tego pola z false na true i odwrotnie. Nie chcę tworzyć całego formularza do edytowania wiersza, poczytałem że teoretycznie da się to zrobic używając link_to.

Wycinek z kontrolera :

[code] def edit_status
@question = Question.find(params[:id])
if @question.open
@question.open = false
else
@question.open = true
end
@question.open = true
@question.save

end[/code]
Wycinek z widoku :

<% if question.open %> <p> Status : Open <%= link_to "Close", root_path(:id => question.id), :action => "edit_status" %> </p> <% else %> <p> Status : Closed <%= link_to "Open", root_path(:id => question.id), :action => "edit_status" %> </p> <% end %>
Kliknąć w link się da jednak nie robi on nic poza przekierowaniem na roota. Nie wykonuje on zadanej akcji. Szczerze mówiąc jestem lekko zagubiony jak to zrobić.

Pozdrawiam

A dlaczego linkujesz do root_path? Bez routes.rb niewiele można powiedzieć o przyczynie - wklej jeszcze zawartość config/routes.rb albo efekt wywołania ‘rake routes’.

http://guides.rubyonrails.org/routing.html
Poczytaj.

Ponieważ tam wyświetla się profil użytkownika i tam też zmienia się ta opcje “open”. Generalnie ten link jest na root_path i przekierowuje na root_path. Chodzi o to żeby klikając w to wykonała się akcja z kontrolera. To nie musi być link, wystarczy jakiś button. Niestety nie znam na tyle railsów żeby użyć czegoś konkretniejszego.

Edit: Dodam wypis z rake routes jak przejdę na ubuntu za jakąś godzinkę.

[code=ruby]# config/routes.rb

zakładając, że masz :questions jako REST

resources :questions do
get :update_status, on: :member
end[/code]

[code=ruby]# questions_controller.rb

def update_status
@question = Question.find(params[:id])
@question.update_attribute(:open, !@question.open)

redirect_to root_path

end[/code]

<p> Status : <%= quesion.open? ? 'Open' : 'Closed' %> <%= link_to question.opened? ? 'Closed' : 'Opened',  update_status_question_path(question) %> </p>

Nie mam 100% pewności, ze to zadziała, mogę być jakieś błedy składniowe w szczególności przy operatorzr ‘?’. Poza tym możnaby z widoku przenieść te ify do helpera. Ale moim zdaniem tak to powinno wygladac.

Nie jestem pewien, czy route bedzie dokładnie update_status_question_path, ale to możesz sprawdzic w rake routes.

[quote=sarniak]<p> Status : <%= quesion.open? ? 'Open' : 'Closed' %> <%= link_to question.opened? ? 'Closed' : 'Opened', update_status_question_path(question) %> </p>
[/quote]
Jezu. Czy został wprowadzony jakiś podatek za używanie nawiasów?
(pomijam już błędy językowe i projektowe – jedna akcja dla dwóch przeciwnych operacji, do not want)

[quote=Tomash][quote=sarniak]<p> Status : <%= quesion.open? ? 'Open' : 'Closed' %> <%= link_to question.opened? ? 'Closed' : 'Opened', update_status_question_path(question) %> </p>
[/quote]
Jezu. Czy został wprowadzony jakiś podatek za używanie nawiasów?
(pomijam już błędy językowe i projektowe – jedna akcja dla dwóch przeciwnych operacji, do not want)[/quote]
Pisałem na szybko jako rozwiązanie problemu z pierwszego posta, bo tak to mniej więcej można zrobić. Teraz jak na to patrzę, no to rzeczywiście niepotrzebnie się sugerowałem takim projektem ;).

Tylko nie rozumiem co jest złego w jednej akcji (nazwa jest niefortunna), jakby ją nazwać toggle_status - z tego co ja zrozumiałem to ma zmieniać wartość atrybutu na przeciwną, więc jak najbardziej wystarczy jedna.

EDIT: a żeby było po ładniej, to można np. tak napisać:

[code=ruby] = render partial: ‘question_status’, locals: { open: question.open}

_question_status.html.erb

Status: <%= question_status_label(open) %> <%= link_to question_status_link_body(open), update_status_question_path(question) %>

[/code] [code=ruby]# w helperze

def question_status_label(open)
open ? “Opened” : “Closed”
end

def question_status_link_body(open)
open ? “Close” : “Open”
end[/code]
No i jeszcze jakby dodać I18n to by miało ręce i nogi.

Dochodzę do wniosku lepiej nie pisać, niż pisać w pośpiechu, to by przecież nawet peer review nie przeszło u mnie w firmie, wybaczcie :wink:

Dzięki za pomoc. Poczytałem troszkę w rails guides i wasze posty i problem rozwiązany.

Pozdrawiam