В Rails как я могу сказать в моем AJAX JS файле, какую кнопку нажимали - PullRequest
0 голосов
/ 25 апреля 2020

В моем приложении Rails у меня есть представление уведомлений. html .erb с несколькими формами, которые создаются динамически на основе нескольких различных моделей, таких как Child.rb и Friend.rb.

notify. html .erb

<% @user.children.order("created_at").each do |child| %>
  <%= form_for(child, :method => :put, :remote => true)) do |f| %>
    <div class="notify-name"><%= child.name %></div>
    <%= f.email_field :email, :required => true, :placeholder => "Email Address", :class => "invite-email" %>
    <%= f.submit "Invite", :class => "btn btn-primary invite-user-btn" %>
  <% end %>
<% end %>

<% @user.friends.order("created_at").each do |friend| %>
  <%= form_for(friend, :method => :put, :remote => true)) do |f| %>
    <div class="notify-name"><%= friend.name %></div>
    <%= f.email_field :email, :required => true, :placeholder => "Email Address", :class => "invite-email" %>
    <%= f.submit "Invite", :class => "btn btn-primary invite-user-btn" %>
  <% end %>
<% end %>

Для форм установлено значение remote => true, поэтому они обрабатываются AJAX. В каждом действии обновления контроллера у меня есть:

children_controller.rb

def update
    child = Child.find(params[:id])
    email = params[:child][:email]
    if child.update(child_params)
      UserMailer.invite_new_user(current_user, child.name, email).deliver_later
      respond_to do |format|  
        format.html { redirect_back(fallback_location: documents_path) }
        format.js
      end  
    end
end

В моем обновлении. js .erb файл, я хочу иметь возможность выберите указанную кнопку c, на которую нажали. Но, как вы можете видеть из моего представления выше, в кнопках нет ничего уникального (они создаются динамически в зависимости от количества детей и друзей, которые есть у пользователя, и у каждого из них один класс). Как я могу получить кнопку, на которую нажали, чтобы я мог обновить значение этой кнопки?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

Передайте скрытое поле, каждое жестко закодировано с указанным значением c. Тогда вы можете получить эти параметры в поле зрения

% @user.children.order("created_at").each do |child| %>
  <%= form_for(child, :method => :put, :remote => true)) do |f| %>
    <%= hidden_field_tag 'invitable_type', 'child' %>
    <div class="notify-name"><%= child.name %></div>
    <%= f.email_field :email, :required => true, :placeholder => "Email Address", :class => "invite-email" %>
    <%= f.submit "Invite", :class => "btn btn-primary invite-user-btn" %>
  <% end %>
<% end %>

<% @user.friends.order("created_at").each do |friend| %>
  <%= form_for(friend, :method => :put, :remote => true)) do |f| %>
    <%= hidden_field_tag 'invitable_type', 'friend' %>
    <div class="notify-name"><%= friend.name %></div>
    <%= f.email_field :email, :required => true, :placeholder => "Email Address", :class => "invite-email" %>
    <%= f.submit "Invite", :class => "btn btn-primary invite-user-btn" %>
  <% end %>
<% end %>

, теперь в вашем update.js.erb вы можете получить к нему доступ как

<% if params[:invitable_type] == 'friend' %>
// you js code to enable button for friend
<% elsif params[:invitable_type] == 'child' %>
// you js code to enable button for child
<% end %>
0 голосов
/ 25 апреля 2020

Добавить скрытое поле с дочерним идентификатором

<% @user.children.order("created_at").each do |child| %>
  <%= form_for(child, :method => :put, :remote => true)) do |f| %>
    <div class="notify-name"><%= child.name %></div>
    <%= f.email_field :email, :required => true, :placeholder => "Email Address", :class => "invite-email" %>

    <%= f.hidden_field :id, value: child.id %>

    <%= f.submit "Invite", :class => "btn btn-primary invite-user-btn" %>
  <% end %>
<% end %>

Это будет представлять id дочернего элемента в параметрах

в контроллере

def update
  child = Child.find(params[:child][:id])
  email = params[:child][:email]

  if child.update(child_params)
    UserMailer.invite_new_user(current_user, child.name, email).deliver_later

    respond_to do |format|  
      format.html { redirect_back(fallback_location: documents_path) }
      format.js
    end  
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...