Rails3: Есть ли лучшая практика для обновления атрибутов без формы? - PullRequest
2 голосов
/ 25 декабря 2010

Я застрял на этом в течение нескольких дней, и я боюсь, что мне не хватает словарного запаса, чтобы правильно задать этот вопрос, но любая обратная связь очень ценится!

Я работаю над основным сайтом блога. Пользователи могут создавать сообщения с заголовком, описанием и объявлять, могут ли другие просматривать сообщение (публичное или частное). На главной странице я хочу, чтобы пользователь мог видеть список своих сообщений, переключать публичные | личные и удалять сообщения. Перечисление легко (я отрисовываю частичное на основе сообщений пользователя), и ссылка удаления AJAX работает хорошо:

<%= link_to 'Delete Post', post, :confirm => 'Are you sure?', :method => :delete, :remote => true %>

Переключение public | private соответствует действию редактирования / обновления, и я не могу понять, как это сделать, используя ссылку или кнопку - кажется, мне нужно использовать форму. Я перепробовал множество вариантов рабочей кнопки удаления, которые выглядят примерно так (и ни одна из них не работает):

<%= link_to 'Make Public', { :controller => "posts", :action => "update", :id => post, :public => true, :post => post }, :method => :put, :remote => true %>

Единственный способ работы с формой, но для этого необходимо, чтобы пользователь нажал кнопку Update Post:

<%= form_for(post, :remote => true) do |f| %>
  <div class="field">
    <%= f.label :public %><br />
    <%= f.check_box :public %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

Итак, в Rail3, как правильно обновлять отдельный атрибут? (Есть ли более подходящие слова?) Это можно сделать с помощью ссылки или кнопки? Должен ли я использовать форму? Есть ли способ Rails3 (например, destroy.js.erb) добавить событие onclick / onchange или мне нужно разработать собственный JavaScript?


Ответ Заббы велик; однако в конечном итоге я использовал скрытую форму, отправленную через JavaScript (в частности, jQuery).

В виде:

<div>
  <%= form_for(post, :remote => true) do |f| %>
    <%= f.hidden_field :public, { :value => !post.public } %>
  <% end %>
  <% if post.public == true %>
    <div class="pp">Public</div>
  <% else %>
    <div class="pp">Private</div>
  <% end %>
</div>

JavaScript:

$('.pp').live('click', function(){
  $(this).siblings('form').submit();
});

Комментарии к двум подходам? Еще один идиоматик?

1 Ответ

4 голосов
/ 25 декабря 2010

Я бы сделал это так (не проверял, поэтому могут быть небольшие ошибки):

  1. Создать действие с именем make_public в PostsController

    а. Ссылка "будет такой: <% = button_to" Сделать общедоступной ",: подтвердить =>" Вы уверены? ",: Метод =>: положить,: удаленный => true%>

    б. Акция получит идентификатор сообщения (params[:id])

  2. Определите метод с именем make_public в модели Post. а. Звоните update_attributes :make_public => true

Ссылка, которая выполняет обновление , должна быть PUT , а не GET (Всегда помещать все действия по изменению состояния после POST или PUT)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...