Как мне переключать состояния ссылок при нажатии с AJAX и Rails? - PullRequest
1 голос
/ 11 января 2010

В одном из моих действий с индексами я хочу отобразить ссылку с надписью «активировать» или «деактивировать», в зависимости от того, активна запись или нет.

Когда пользователь нажимает ссылку «активировать» или «деактивировать» для определенной записи, необходимо выполнить вызов для моего действия по обновлению, чтобы соответствующим образом обновить запись, и если ссылка сказала «активировать», это должно быть изменено на «деактивировать» и наоборот.

Как мне этого достичь? Я посмотрел на link_to_remote, но не представляю, как переключить текст для ссылки.

Ответы [ 2 ]

1 голос
/ 15 января 2010

На мой взгляд, я поставил это:

<% for account in @accounts %>
  <tr id="<%= "update[#{account.id}]" %>">
    <%= render :partial => "account", :object => account %>
  </tr>
<% end %>

В своем действии обновления я поместил это:

def update
  @account = Account.find(params[:id])

  respond_to do |format|
    if @account.update_attributes(params[:account])
      format.html do redirect_to(@account)
        flash[:notice] = 'Account was successfully updated.'
      end
      format.xml  { head :ok } 
      format.js   { render :partial => 'account' } 
    else
      format.html { render :action => "edit" } 
      format.xml  { render :xml => @account.errors, :status => :unprocessable_entity } 
    end
  end
end

И в своей части я поместил это:

<td><%=h account.email %></td>
<td><%=h account.password %></td>
<td><%=h account.get_status %></td>
<td><%=h account.network.name %></td>
<td>
  <%=
    link_to_remote(
      # name
      account.get_status == :active ? 'De-activate' : 'Activate',
      # options = {}
      {
        :url =>
        {
          :controller => "accounts",
          :action => :update,
          :id => account.id,
          :account => { :status => account.get_status == :active ? account.find_status(:inactive) : account.find_status(:active) }
        },
        :method => :put,
        :update => "update[#{account.id}]",
      },
      {
        :with => "'account[status]=' + $('account['status']).value"
      }
    )
  %>
</td>
<td><%= link_to 'Edit', edit_account_path(account) %></td>
<td><%= link_to 'Destroy', account, :confirm => 'Are you sure?', :method => :delete %></td>

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

Кроме того, для фактического «переключения» текста ссылки, троичное условие в параметре name, равном link_to_remote, - вот что помогло.

1 голос
/ 11 января 2010

Можно использовать link_to_remote, затем вам нужно ответить на формат js в вашем контроллере и отправить код js для выполнения при обновлении страницы:

  update_page do |page|
    page.replace_html 'link_id', "<a href='#'>OtherState</a>"
    page.visual_effect :highlight, 'link_id' # you can highlight the item to give more feedback to the user
  end
...