Rails 및 FormData
11682 단어 FormDataRubyJavaScriptRails
Rails and FormData
Rails와FormData에 관한 기사입니다.영어와 일본어로 모두 씁니다.
This post talks about using WebAPI's FormData with Rails.
최근Rails의 Form부터 API 기반 시스템으로 교체되었습니다.폼과 백엔드를 XHR의 요청axios으로 대체해 협업했다는 것이다.
We recently migrated from using Rails forms to an API based app where data is sent to the backend using XHR requests (in our case, using axios ).
이 글은 전형적인 사용자 모델을 사용한다.
For the following example I will be using a generic User model.
문제/ Problem
Rails Form·Using Rails Form 사용
<%= form_for @user, url: {action: "create"} do |f| %>
<%= f.text_field :name %> # "Yokoyama"
<%= f.text_field :role %> # "Developer"
<%= f.submit "Create" %>
<% end %>
Rails의 Form을 사용하는 경우 Controller에는 다음과 같은 params가 있습니다.
If we were using Rails forms then we'd normally get:def create
# params = <ActionController::Parameters
# {
# "user" => {
# "name"=>"Yokoyama",
# "role"=>"Developer"
# },
# "controller"=>"...",
# "action"=>"create",
# }
# permitted: false>
...
end
FormData·Using FormData 사용
팟캐스트를 제작해서 사용했다FormData.
When packaging a body for a POST/PATCH request we used FormData .
const formData = new FormData();
formData.append('name','Yokoyama');
formData.append('role','Developer');
const url = 'user create link';
axios.post(url, formData, {
headers: {
'content-type': 'multipart/form-data',
},
})
...
Rails의 Controller에서 다음과 같은 응답이 있습니다.
On the Rails backend we get:def create
# params = <ActionController::Parameters
# {
# "name"=>"Yokoyama",
# "role"=>"Developer",
# "controller"=>"...",
# "action"=>"create",
# }
# permitted: false>
...
end
관건:
- 속성이 최상위 수준에서 동명 문제가 발생할 수 있습니다.
리즈 모드 아니야.
As you can see:
- All attributes are scoped to the top level, which will cause issues if there are name conflicts
- It's also just against the typical Rails pattern
해결/ 솔루션
원래@jugtuttle on Medium가 쓴 해결 방안이었는데, 모델의 이름을 열쇠에 포함하면 성공한다.
@jugtuttle on Medium pointed out that you can simply use a key that has the model name. So in our case:const formData = new FormData();
formData.append('user[name]','Yokoyama');
formData.append('user[role]','Developer');
axios.post('insert user path here', formData, {
headers: {
'content-type': 'multipart/form-data',
},
})
...
더욱 간단하도록:
To make it even easier:
// rails_form_data.js
class RailsFormData extends FormData {
constructor(model) {
super();
this.model = model;
}
append(key, value) {
super.append(`${this.model}[${key}]`, value);
}
}
export default RailsFormData;
import RailsFormData from '...'
const formData = new RailsFormData('user');
formData.append('name','Yokoyama');
formData.append('role','Developer');
axios.post('insert user path here', formData, {
headers: {
'content-type': 'multipart/form-data',
},
})
...
결실
Rails의 controller에는 다음과 같은 상태가 있습니다.
Then on the Rails backend side you'll get: def create
# params = <ActionController::Parameters
# {
# "user" => {
# "name"=>"Yokoyama",
# "role"=>"Developer"
# },
# "controller"=>"...",
# "action"=>"create",
# }
# permitted: false>
...
end
Reference
이 문제에 관하여(Rails 및 FormData), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/nbw/items/274591bbeafb58c56193
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
<%= form_for @user, url: {action: "create"} do |f| %>
<%= f.text_field :name %> # "Yokoyama"
<%= f.text_field :role %> # "Developer"
<%= f.submit "Create" %>
<% end %>
def create
# params = <ActionController::Parameters
# {
# "user" => {
# "name"=>"Yokoyama",
# "role"=>"Developer"
# },
# "controller"=>"...",
# "action"=>"create",
# }
# permitted: false>
...
end
const formData = new FormData();
formData.append('name','Yokoyama');
formData.append('role','Developer');
const url = 'user create link';
axios.post(url, formData, {
headers: {
'content-type': 'multipart/form-data',
},
})
...
def create
# params = <ActionController::Parameters
# {
# "name"=>"Yokoyama",
# "role"=>"Developer",
# "controller"=>"...",
# "action"=>"create",
# }
# permitted: false>
...
end
const formData = new FormData();
formData.append('user[name]','Yokoyama');
formData.append('user[role]','Developer');
axios.post('insert user path here', formData, {
headers: {
'content-type': 'multipart/form-data',
},
})
...
// rails_form_data.js
class RailsFormData extends FormData {
constructor(model) {
super();
this.model = model;
}
append(key, value) {
super.append(`${this.model}[${key}]`, value);
}
}
export default RailsFormData;
import RailsFormData from '...'
const formData = new RailsFormData('user');
formData.append('name','Yokoyama');
formData.append('role','Developer');
axios.post('insert user path here', formData, {
headers: {
'content-type': 'multipart/form-data',
},
})
...
def create
# params = <ActionController::Parameters
# {
# "user" => {
# "name"=>"Yokoyama",
# "role"=>"Developer"
# },
# "controller"=>"...",
# "action"=>"create",
# }
# permitted: false>
...
end
Reference
이 문제에 관하여(Rails 및 FormData), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/nbw/items/274591bbeafb58c56193텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)