Rails: Как переключить логическое поле из вида? - PullRequest
0 голосов
/ 13 июня 2010

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

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

#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 = !@matching.employer_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>

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

Ответы [ 2 ]

1 голос
/ 17 февраля 2011

Просто уведомление:

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

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

def set_employer_stars
end

def unset_employer_stars
end

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

1 голос
/ 13 июня 2010

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

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

- Обновление: после обновления вопрос:

Вы должны создать партиал, который визуализирует вашу кнопку сохранения / несохранения следующим образом, назовите ее "_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 = !@matching.employer_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 везде.

...