2010-06-13 2 views
0

У меня есть булевское поле, которое называется «сохранено» в моей базе данных. Я хочу переключить это поле, нажав на текстовую ссылку, которая изменяется от «Сохранить» до «Отменить» в зависимости от ситуации, и обновляет таблицу «Клиент» с 0 или 1. Я полагаю, что Javascript может быть способом пойти на это но я недостаточно опыт (пока!) в Javascript, чтобы знать, как его кодировать.Rails: Как переключить булевское поле с точки зрения?

Я отбросил вопрос, чтобы он был короче. Вот мой точный код.

#employers controller 
def save_toggle 
    @matching = Matching.find(params[:id]) 
    if @matching.employer_stars == false 
    @matching.employer_rejects = false # If saving a match, remove any existing rejection. 
    end 
    @matching.employer_stars = [email protected]_stars 
    @matching.save 
    render :partial => "save_unsave_buttons", :layout => false 
end 

#view home.html.erb 
<%= render :partial => "save_unsave_buttons", :locals => {:matching => matching} %> 

#partial _save_unsave_buttons.html.erb 
<div id="save_buttons" class="buttonText"> #latter is just for CSS layout 
    <% if @matching.employer_stars %> 
    <%= link_to_remote "Unsave", 
     :url => {:action => "save_toggle", :id => matching.id}, 
     :update => {:success => "save_buttons", :failure => "Error"} %> 
    <% else %> 
    <%= link_to_remote "Save", 
     :url => {:action => "save_toggle", :id => matching.id}, 
     :update => {:success => "save_buttons", :failure => "Error"} %> 
    <% end %> 
</div> 

База данных работает, но текст переключения не переключается. Чтобы @nathanvda: Мне очень жаль, что я испытываю такую ​​боль. Я хочу подтвердить ваш ответ, но я знаю, если я это сделаю, я просто оставлю это на некоторое время, а потом вернусь к нему и снова расстроюсь! Спасибо чувак.

ответ

1

Вы должны определить контроллер-метод, который устанавливает ваш атрибут saved. По вашему мнению, вы можете ссылаться на этот метод, используя link_to_remote.

Это должно вас начать.

--update: после того, как обновленный вопрос:

Вы должны создать частичный, что делает ваши сохранения/unsave кнопку, как это, называют его "_save_unsave_buttons.html.erb":

<div id="save_buttons"> 
    <% if matching.employer_stars %> 
    <%= link_to_remote "Unsave", 
     :url => {:action => "save_toggle", :id => matching.id}, 
     :update => {:success => "save_buttons", :failure => "Error"} %> 
    <% else %> 
    <%= link_to_remote "Save", 
     :url => {:action => "save_toggle", :id => matching.id}, 
     :update => {:success => "save_buttons", :failure => "Error"} %> 
    <% end %> 
</div> 

Этот частичный вы получите правильные кнопки сохранения, а после обновления содержащий div будет обновлен/заменен результатом действия вашего контроллера.

С внутри главного окна, написать

<%= render :partial => "save_unsave_buttons", :locals => {:matching => match } %> 

где вы хотите кнопки, чтобы быть видимыми.

А внутри контроллера:

def save_toggle 
    @matching = Matching.find(params[:id]) 
    @matching.employer_stars = [email protected]_stars 
    @matching.save 
    render :partial => "save_unsave_buttons", :locals => {:matching => @matching}, :layout => false 
end 

Успехов!

- Повторите попытку: так что я предполагаю, что вы представляете набор @matchings, я бы немного изменил именование между коллекцией и элементом, чтобы предотвратить больше путаницы и случайных ошибок.

Но на самом деле это довольно просто:

@matchings.each do |match| 
    .. build your view here .. 
    <%= render :partial => "save_unsave_buttons", :locals => {:matching => match} 
end 

и в вашем парциальное вы можете использовать правильный matching везде.

+0

Привет, @nathanvda, спасибо за комментарии. Я обновил свой вопрос выше. – sscirrus

+0

Привет @sscirrus: я обновил свой ответ соответственно. Надеюсь, теперь это ясно? – nathanvda

+0

Привет @nathanvda: Я почти там. Только окончательная ошибка, чтобы пройти мимо - мне нужно было добавить: locals в вызове частичного, чтобы он распознал «соответствие». Но переключатели не работают. Дополнительную информацию см. В моем обновлении. Я дал вам 1+ до сих пор, и спасибо. – sscirrus

1

Только уведомление:

Ваш save_toggle метод не RESTful. Глагол HTTP PUT должен быть реализован idempotent (см. O.a. http://en.wikipedia.org/wiki/Idempotence#Examples), что означает, что он всегда должен делать то же самое независимо от того, как часто вы его выполняете. В вашем примере выполнение метода save_toggle один раз не дает того же результата, что и выполнение его дважды.

Лучше практикой было бы сделать два метода, например .:

def set_employer_stars 
end 

def unset_employer_stars 
end 

или что вы хотите назвать их.Затем вы также можете использовать эти два разных метода в методах link_to_remote (потому что теперь вы используете save_toggle как в «Unsave», так и «Save»).

+0

Большое спасибо за ваш комментарий Van der Hoorn. Я возьму его на борт. – sscirrus

Смежные вопросы