rails options_from_collection_for_select

15262 단어 Rails

개시하다


4collection_check_boxes 똑같이 쓸 수 있는데.
options_from_collectoin_for_셀렉트라는 조수법이 있어요.
이것은 이름에서 볼 수 있듯이 select 라벨을 사용할 때의 방법이다
예를 들어, 기존 태그의 이름에서 선택 태그가 자동으로 생성됩니다.

사용법


우선 rails guides의 options. - 네.from_collection_for_select 표시
콜렉션의 결과를 열거한 옵션에 표시된 문자열을 되돌려주고 호출된 결과를valuemethod,text에 옵션 값으로 할당method에 옵션 텍스트로 할당합니다.
이렇게 쓰여 있다.
여느 때처럼 한 번만 보면 이해가 안 돼...
이런 일도 있고.
돌아오는 건 옵션밖에 없어요.따라서 출력 결과의 바깥쪽은 적당한 HTML select 태그로 싸야 한다.
중요한 것은
<%= options_from_collection_for_select(:tag_ids, Tag.all, :id, :name) do |tag| %>
.....
<% end %>

이렇게 사용하는 게 아니라 이 옵션입니다.from_collection_for_만약 select 바깥쪽에서 select를 사용한다면
<%= select_tag :tag_id ..... %>
반드시 그렇게 해야 한다
실제 사용 방법으로 삼다
<%= select_tag :tag_id,
           options_from_collection_for_select(Tag.all, :id, :name, params[:tag_id]),
           {
                       prompt: 'タグで絞り込み',
                       class: 'form-control select_css_tag',
           }
%>
이런 느낌.

실제로 사용해볼게요.

rails g model article title
rails g model tag name
rails g model article_tags article:references tag:references
rails db:migrate
rails g controller articles
routes의 설정은 Resources를 사용합니다
모델의 설정은 기본적인 다대다 설정입니다.
controller
articles_controller.rb

class ArticlesController < ApplicationController
  def index
    @articles = Article.all 
  end

  def new 
    @article = Article.new 
  end 

  def create 
    article = Article.new(article_params)
    tag = Tag.find(params[:tag_id])
    if article.save 
      article.tags << tag
      redirect_to articles_path 
    else 
      render :new 
    end 
  end 

  private 

  def article_params 
    params.require(:article).permit(:title,:tag_id)
  end   
end

일단create에서article을 저장한 다음
article.tags << tag
article태그를 만들고 있습니다.
view
<%= form_with model: @article, local: true do |f| %>
    <%= f.label :title %>
    <%= f.text_field :title %>

    <%= select_tag :tag_id,
         options_from_collection_for_select(Tag.all, :id, :name, params[:tag_id]), 
            {
                prompt: 'タグを選択',
            }
    %>
    <%= f.submit %>
<% end %>

이런 느낌.
참고로 여러 개의 값을 저장하려면 멀티플렉스를 지정하면 됩니다

<%= form_with model: @article, local: true do |f| %>
    <%= f.label :title %>
    <%= f.text_field :title %>

    <%= select_tag :tag_id,
         options_from_collection_for_select(Tag.all, :id, :name, params[:tag_id]), 
            {
                prompt: 'タグを選択',
                multiple: true
            }
    %>
    <%= f.submit %>
<% end %>

이렇게 하면 여러 개를 저장할 수 있다.

들키다


나 이거 하다가 눈치챘어.
select_만약 multiple이 사실이라면,params[:tag id]가 배열될 것입니다
controller의create 동작

def create 
    @article = Article.new(article_params)
    @tag = Tag.find(params[:tag_id])
    if @article.save 
      @article.tags << @tag
      redirect_to articles_path 
    else 
      render :new 
    end 
  end 
이렇게 해도 여러 개를 저장할 수 있다.
binding.pry로 찾아봤어요.
Tag.find(params[:tag_id])
장소id가 "1", "2"인 경우
    10: def create
    11:   @article = Article.new(article_params)
    12:   @tag = Tag.find(params[:tag_id])
    13:   binding.pry
 => 14:   if @article.save
    15:     @article.tags << @tag
    16:     redirect_to articles_path
    17:   else
    18:     render :new
    19:   end
    20: end

[1] pry(#<ArticlesController>)> @tag
=> [#<Tag:0x00007f36182a6d90
  id: 1,
  name: "Ruby",
  created_at: Mon, 11 Feb 2019 06:35:46 UTC +00:00,
  updated_at: Mon, 11 Feb 2019 06:35:46 UTC +00:00,
  article_id: nil>,
 #<Tag:0x00007f36182a6c50
  id: 2,
  name: "Ruby on Rails",
  created_at: Mon, 11 Feb 2019 06:35:58 UTC +00:00,
  updated_at: Mon, 11 Feb 2019 06:35:58 UTC +00:00,
  article_id: nil>]
[2] pry(#<ArticlesController>)>
이런 느낌으로 잘 지워버렸어요.
Model.나는find가 하나만 가져갈 수 있을 줄 알았기 때문에 대발견이었다.
그리고 이것은 기본적인 일일 수도 있다.정렬 시
@article.tags << @tag
문제 없을 거예요.
보통이면 순환을 할게요.
@tag.each do |tag|
  @article.tags << tag 
end 
이렇게 끝났어.
종결어.

좋은 웹페이지 즐겨찾기