Ruby on Rails : 양식으로 배열 제출
배열 인 속성이있는 모델이 있습니다. 양식 제출에서 해당 속성을 채우는 적절한 방법은 무엇입니까?
이름에 대괄호가 포함 된 필드가있는 양식 입력이 있으면 입력에서 해시가 생성된다는 것을 알고 있습니다. 나는 그것을 가지고 컨트롤러에서 그것을 통해 그것을 배열로 마사지해야합니까?
덜 추상적으로 만드는 예 :
class Article
serialize :links, Array
end
링크 변수는 URL 배열의 형식을 취합니다. 즉 [["http://www.google.com"], ["http://stackoverflow.com"]]
내 양식에서 다음과 같은 것을 사용하면 해시가 생성됩니다.
<%= hidden_field_tag "article[links][#{url}]", :track, :value => nil %>
결과 해시는 다음과 같습니다.
"links" => {"http://www.google.com" => "", "http://stackoverflow.com" => ""}
링크 이름에 URL을 포함하지 않으면 추가 값이 서로 충돌합니다.
<%= hidden_field_tag "article[links]", :track, :value => url %>
결과는 다음과 같습니다. "links" => "http://stackoverflow.com"
HTML 양식에 빈 대괄호가있는 입력 필드가 있으면 컨트롤러의 매개 변수 내부에 배열로 바뀝니다.
# Eg multiple input fields all with the same name:
<input type="textbox" name="course[track_codes][]" ...>
# will become the Array
params["course"]["track_codes"]
# with an element for each of the input fields with the same name
추가 :
레일 도우미는 배열 트릭을 자동으로 수행하도록 설정되어 있지 않습니다 . 따라서 이름 속성을 수동으로 만들어야 할 수도 있습니다. 또한 체크 박스 헬퍼는 체크되지 않은 케이스를 처리하기 위해 추가적인 숨겨진 필드를 생성하기 때문에 레일스 헬퍼를 사용하는 경우 체크 박스 자체에 문제가 있습니다.
= simple_form_for @article do |f|
= f.input_field :name, multiple: true
= f.input_field :name, multiple: true
= f.submit
HTML []
규칙 의 TL; DR 버전 :
정렬:
<input type="textbox" name="course[track_codes][]", value="a">
<input type="textbox" name="course[track_codes][]", value="b">
<input type="textbox" name="course[track_codes][]", value="c">
받은 매개 변수 :
{ course: { track_codes: ['a', 'b', 'c'] } }
해시시
<input type="textbox" name="course[track_codes][x]", value="a">
<input type="textbox" name="course[track_codes][y]", value="b">
<input type="textbox" name="course[track_codes][z]", value="c">
받은 매개 변수 :
{ course: { track_codes: { x: 'a', y: 'b', z: 'c' } }
또한 이와 같은 입력 도우미를 전달하면 각각 고유 한 속성을 가진 일련의 과정을 얻게된다는 것을 알게되었습니다.
# Eg multiple input fields all with the same name:
<input type="textbox" name="course[][track_codes]" ...>
# will become the Array
params["course"]
# where you can get the values of all your attributes like this:
params["course"].each do |course|
course["track_codes"]
end
jquery taginput을 사용하여 솔루션을 설정했습니다.
http://xoxco.com/projects/code/tagsinput/
사용자 정의 simple_form 확장을 작성했습니다.
# for use with: http://xoxco.com/projects/code/tagsinput/
class TagInput < SimpleForm::Inputs::Base
def input
@builder.text_field(attribute_name, input_html_options.merge(value: object.value.join(',')))
end
end
coffeescrpt 스 니펫 :
$('input.tag').tagsInput()
그리고 슬프게도 약간 구체적이어야하는 내 컨트롤러를 조정했습니다.
@user = User.find(params[:id])
attrs = params[:user]
if @user.some_field.is_a? Array
attrs[:some_field] = attrs[:some_field].split(',')
end
For those who use simple form, you may consider this solution. Basically need to set up your own input and use it as :array. Then you would need to handle input in your controller level.
#inside lib/utitilies
class ArrayInput < SimpleForm::Inputs::Base
def input
@builder.text_field(attribute_name, input_html_options.merge!({value: object.premium_keyword.join(',')}))
end
end
#inside view/_form
...
= f.input :premium_keyword, as: :array, label: 'Premium Keyword (case insensitive, comma seperated)'
#inside controller
def update
pkw = params[:restaurant][:premium_keyword]
if pkw.present?
pkw = pkw.split(", ")
params[:restaurant][:premium_keyword] = pkw
end
if @restaurant.update_attributes(params[:restaurant])
redirect_to admin_city_restaurants_path, flash: { success: "You have successfully edited a restaurant"}
else
render :edit
end
end
In your case just change :premium_keyword to the your array field
참고URL : https://stackoverflow.com/questions/3089849/ruby-on-rails-submitting-an-array-in-a-form
'Programing' 카테고리의 다른 글
Dispose가 'using'블록에 대해 호출되지 않는 상황이 있습니까? (0) | 2020.11.13 |
---|---|
{{object.field}} 존재 여부를 확인하지 않으면 오류 (0) | 2020.11.13 |
빈 커밋 메시지로 인해 커밋 중단 (0) | 2020.11.13 |
도킹이 해제되면 Android 스튜디오의 '미리보기'설정에 '도킹 모드'옵션이 없습니다. (0) | 2020.11.13 |
Windows에서 ack 라이브러리를 어떻게 설치하고 사용할 수 있습니까? (0) | 2020.11.13 |