【Ruby on Rails】Ajax에서 특정 요소 변경
소개
Rails의 Ajax를 사용하여 특정 요소를 편집하고 업데이트하는 방법을 설명합니다.
예에서 간단한 카테고리 목록 화면의 하나의 카테고리 이름을 업데이트하는 프로세스를 사용합니다.
버전
화면 개요
다음과 같은 화면입니다.
이 오른쪽에 있는 연필 마크의 편집 아이콘 버튼을 누르면 해당 행의 카테고리 이름이 양식으로 바뀝니다.
카테고리 이름을 변경하고 '업데이트'를 누르면,
변경된 범주 이름으로 데이터가 업데이트되고 표시가 비동기적으로 변경됩니다.
예에서는 교통 → 교통비로 변경합니다.
처리 개요
link_to에
remote: true
옵션을 붙입니다. 구현 전
구현 전의 주요 코드 부분은 다음과 같습니다.
app/controllers/categories_controller.rbdef index
@categories = Category.where(user: current_user).order(:created_at)
end
app/views/categories/index.html.erb<ul class="todo-list" id="own-categories">
<% @categories.each do |category| %>
<li id="category-list-id-<%= category.id %>">
<%= render 'a_category_list', category: category %>
</li>
<% end %>
</ul>
app/views/categories/_a_category_list.html.erb<span class="handle ui-sortable-handle">
<i class="fa fa-ellipsis-v"></i>
<i class="fa fa-ellipsis-v"></i>
</span>
<span class="text"><%= category.name %></span>
<%= category.common_mark %>
<div class="tools">
<%= link_to edit_category_path(category), class: "text-redpepper space-left" do %>
<i class="fa fa-lg fa-edit"></i>
<% end %>
<%= category.common_btn %>
</div>
카테고리 이름을 편집하는 양식으로 변경하는 Ajax 처리 구현
연필 마크의 편집 아이콘 버튼을 누르고, 카테고리명의 요소를 폼 요소로 변경하는 처리를 기재해 갑니다.
※주의: 설명하지 않는 class 속성이나 id 속성 등이 있습니다만, Ajax 처리와는 관계 없습니다.
1. Ajax에 대한 옵션 추가
편집 아이콘 버튼에 remote: true를 넣는다.
app/views/categories/_a_category_list.html.erb<%= link_to edit_category_path(category), remote: true, class: "text-redpepper space-left" do %>
<i class="fa fa-lg fa-edit"></i>
<% end %>
2. Ajax에 대한 라우팅 추가
Ajax 할 때도 라우팅의 resources 메소드가 유연하게 대응해줍니다.
여기에서는 edit 액션을 추가합니다.
config/routes.rbresources :categories, only: [:index, :edit]
3. 컨트롤러에서 객체 얻기
app/controllers/categories_controller.rbdef edit
@category = Category.find(params[:id])
end
4. 추가한 액션을 위한 JavaScript용 view 파일을 준비하고 화면의 해당 요소를 변경하기 위한 JavaScript를 기재
edit 액션이므로 app/views/categories/edit.js.erb
를 만듭니다.
app/views/categories/edit.js.erbid = "<%= @category.id %>";
target = document.querySelector(`#category-list-id-${id}`);
html = "<%= j(render partial: 'form', locals: { category: @category }) %>";
target.innerHTML = html;
app/views/categories/_form.html.erb<%= form_with(model: category) do |form| %>
<div class="row">
<div class="col-xs-10">
<div class="input-group input-group-sm">
<%= form.text_field :name, value: category.name, required: true, class:"form-control", max: 15 %>
<span class="input-group-btn">
<%= form.submit submit_btn_letters, class: "btn btn-brown" %>
</span>
</div>
</div>
<div class="col-xs-1">
<%= category.cancel_btn %>
</div>
</div>
<% end %>
이제 카테고리 이름을 편집하기 위한 양식을 볼 수 있습니다.
카테고리 이름을 업데이트하는 Ajax 처리 구현
편집 양식으로 변경할 수 있었으므로, 다음에, 변경하고 싶은 문자 「교통비」로 변경해,
갱신 버튼을 누르고, 갱신 후의 카테고리명을 표시하는 처리를 기재해 갑니다.
1. Ajax에 대한 옵션 추가
form_with에 remote: true
옵션을 추가합니다.
(명시적으로 기재하지 않아도 디폴트로 remote: true 는 되어 있다.)
app/views/categories/_form.html.erb<%= form_with(model: category, remote: true) do |form| %>
<!-- 省略 -->
<% end %>
2. Ajax에 대한 라우팅 추가
update 액션 추가
config/routes.rbresources :categories, only[:index, :edit, :update]
3. 컨트롤러에서 객체 업데이트
카테고리 이름을 '교통비'로 업데이트합니다.
app/controllers/categories_controller.rbdef update
@category = Category.find(params[:id])
@category.update(category_params)
end
private
def category_params
params.require(:category).permit(:name, :is_common)
end
4. 추가한 액션을 위한 JavaScript용 view 파일을 준비하고 화면의 해당 요소를 변경하기 위한 JavaScript를 기재
편집 양식을 업데이트된 카테고리 이름으로 변경하는 작업을 수행합니다.
update 액션이므로 app/views/categories/update.js.erb
를 작성합니다.
app/views/categories/update.js.erbid = "<%= @category.id %>";
target = document.querySelector(`#category-list-id-${id}`);
html = "<%= j(render partial: 'categories/a_category_list', locals: { category: @category }) %>";
target.innerHTML = html;
이제 카테고리 이름을 비동기적으로 업데이트할 수 있었습니다.
결론
JavaScript로 Ajax 처리를 작성해도 좋지만 간단한 Ajax는 Rails이면 쉽게 할 수 있습니다.
다만, 〇〇.js.erb
의 쓰는 방법은 버릇이 강하기 때문에 요주의입니다.
Reference
이 문제에 관하여(【Ruby on Rails】Ajax에서 특정 요소 변경), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kwskshh/items/12e936b144d9c4b1b6ca
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
def index
@categories = Category.where(user: current_user).order(:created_at)
end
<ul class="todo-list" id="own-categories">
<% @categories.each do |category| %>
<li id="category-list-id-<%= category.id %>">
<%= render 'a_category_list', category: category %>
</li>
<% end %>
</ul>
<span class="handle ui-sortable-handle">
<i class="fa fa-ellipsis-v"></i>
<i class="fa fa-ellipsis-v"></i>
</span>
<span class="text"><%= category.name %></span>
<%= category.common_mark %>
<div class="tools">
<%= link_to edit_category_path(category), class: "text-redpepper space-left" do %>
<i class="fa fa-lg fa-edit"></i>
<% end %>
<%= category.common_btn %>
</div>
연필 마크의 편집 아이콘 버튼을 누르고, 카테고리명의 요소를 폼 요소로 변경하는 처리를 기재해 갑니다.
※주의: 설명하지 않는 class 속성이나 id 속성 등이 있습니다만, Ajax 처리와는 관계 없습니다.
1. Ajax에 대한 옵션 추가
편집 아이콘 버튼에 remote: true를 넣는다.
app/views/categories/_a_category_list.html.erb
<%= link_to edit_category_path(category), remote: true, class: "text-redpepper space-left" do %>
<i class="fa fa-lg fa-edit"></i>
<% end %>
2. Ajax에 대한 라우팅 추가
Ajax 할 때도 라우팅의 resources 메소드가 유연하게 대응해줍니다.
여기에서는 edit 액션을 추가합니다.
config/routes.rb
resources :categories, only: [:index, :edit]
3. 컨트롤러에서 객체 얻기
app/controllers/categories_controller.rb
def edit
@category = Category.find(params[:id])
end
4. 추가한 액션을 위한 JavaScript용 view 파일을 준비하고 화면의 해당 요소를 변경하기 위한 JavaScript를 기재
edit 액션이므로
app/views/categories/edit.js.erb
를 만듭니다.app/views/categories/edit.js.erb
id = "<%= @category.id %>";
target = document.querySelector(`#category-list-id-${id}`);
html = "<%= j(render partial: 'form', locals: { category: @category }) %>";
target.innerHTML = html;
app/views/categories/_form.html.erb
<%= form_with(model: category) do |form| %>
<div class="row">
<div class="col-xs-10">
<div class="input-group input-group-sm">
<%= form.text_field :name, value: category.name, required: true, class:"form-control", max: 15 %>
<span class="input-group-btn">
<%= form.submit submit_btn_letters, class: "btn btn-brown" %>
</span>
</div>
</div>
<div class="col-xs-1">
<%= category.cancel_btn %>
</div>
</div>
<% end %>
이제 카테고리 이름을 편집하기 위한 양식을 볼 수 있습니다.
카테고리 이름을 업데이트하는 Ajax 처리 구현
편집 양식으로 변경할 수 있었으므로, 다음에, 변경하고 싶은 문자 「교통비」로 변경해,
갱신 버튼을 누르고, 갱신 후의 카테고리명을 표시하는 처리를 기재해 갑니다.
1. Ajax에 대한 옵션 추가
form_with에 remote: true
옵션을 추가합니다.
(명시적으로 기재하지 않아도 디폴트로 remote: true 는 되어 있다.)
app/views/categories/_form.html.erb<%= form_with(model: category, remote: true) do |form| %>
<!-- 省略 -->
<% end %>
2. Ajax에 대한 라우팅 추가
update 액션 추가
config/routes.rbresources :categories, only[:index, :edit, :update]
3. 컨트롤러에서 객체 업데이트
카테고리 이름을 '교통비'로 업데이트합니다.
app/controllers/categories_controller.rbdef update
@category = Category.find(params[:id])
@category.update(category_params)
end
private
def category_params
params.require(:category).permit(:name, :is_common)
end
4. 추가한 액션을 위한 JavaScript용 view 파일을 준비하고 화면의 해당 요소를 변경하기 위한 JavaScript를 기재
편집 양식을 업데이트된 카테고리 이름으로 변경하는 작업을 수행합니다.
update 액션이므로 app/views/categories/update.js.erb
를 작성합니다.
app/views/categories/update.js.erbid = "<%= @category.id %>";
target = document.querySelector(`#category-list-id-${id}`);
html = "<%= j(render partial: 'categories/a_category_list', locals: { category: @category }) %>";
target.innerHTML = html;
이제 카테고리 이름을 비동기적으로 업데이트할 수 있었습니다.
결론
JavaScript로 Ajax 처리를 작성해도 좋지만 간단한 Ajax는 Rails이면 쉽게 할 수 있습니다.
다만, 〇〇.js.erb
의 쓰는 방법은 버릇이 강하기 때문에 요주의입니다.
Reference
이 문제에 관하여(【Ruby on Rails】Ajax에서 특정 요소 변경), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kwskshh/items/12e936b144d9c4b1b6ca
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
<%= form_with(model: category, remote: true) do |form| %>
<!-- 省略 -->
<% end %>
resources :categories, only[:index, :edit, :update]
def update
@category = Category.find(params[:id])
@category.update(category_params)
end
private
def category_params
params.require(:category).permit(:name, :is_common)
end
id = "<%= @category.id %>";
target = document.querySelector(`#category-list-id-${id}`);
html = "<%= j(render partial: 'categories/a_category_list', locals: { category: @category }) %>";
target.innerHTML = html;
JavaScript로 Ajax 처리를 작성해도 좋지만 간단한 Ajax는 Rails이면 쉽게 할 수 있습니다.
다만,
〇〇.js.erb
의 쓰는 방법은 버릇이 강하기 때문에 요주의입니다.
Reference
이 문제에 관하여(【Ruby on Rails】Ajax에서 특정 요소 변경), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kwskshh/items/12e936b144d9c4b1b6ca텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)