1

我的目標是向用戶呈現選擇表單,他們可以在其中選擇多個選項。編輯表單是一個SiteGroup,它是一組對象Site。Rails嵌套屬性具有多個選擇和強參數不更新

表單應顯示所有現有網站並突出顯示已選中的網站。

但是,更新工作,但網站不更新。

site_group.rb

class SiteGroup < ActiveRecord::Base 
    has_and_belongs_to_many :sites 
    accepts_nested_attributes_for :sites 
end 

site_groups_controller.rb

class SiteGroupsController < ApplicationController 
    before_action :set_site_group, only: [:show, :edit, :update, :destroy] 

    # GET /site_groups 
    # GET /site_groups.json 
    def index 
    @site_groups = SiteGroup.all 
    end 

    # GET /site_groups/1 
    # GET /site_groups/1.json 
    def show 
    end 

    # GET /site_groups/new 
    def new 
    @site_group = SiteGroup.new 
    end 

    # GET /site_groups/1/edit 
    def edit 
    end 

    # POST /site_groups 
    # POST /site_groups.json 
    def create 
    @site_group = SiteGroup.new(site_group_params) 

    respond_to do |format| 
     if @site_group.save 
     format.html { redirect_to @site_group, notice: 'Site group was successfully created.' } 
     format.json { render :show, status: :created, location: @site_group } 
     else 
     format.html { render :new } 
     format.json { render json: @site_group.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /site_groups/1 
    # PATCH/PUT /site_groups/1.json 
    def update 
    respond_to do |format| 
     if @site_group.update(site_group_params) 
     format.html { redirect_to @site_group, notice: 'Site group was successfully updated.' } 
     format.json { render :show, status: :ok, location: @site_group } 
     else 
     format.html { render :edit } 
     format.json { render json: @site_group.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /site_groups/1 
    # DELETE /site_groups/1.json 
    def destroy 
    @site_group.destroy 
    respond_to do |format| 
     format.html { redirect_to site_groups_url, notice: 'Site group was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_site_group 
     @site_group = SiteGroup.find(params[:id]) 
     @sites = Site.all 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def site_group_params 
     params.require(:site_group).permit(
     :name, 
     :library, 
     sites: [:id] 
    ) 
    end 
end 

_form.html.erb爲SiteGroup

<%= form_for(@site_group) do |f| %> 
    <% if @site_group.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@site_group.errors.count, "error") %> prohibited this site_group from being saved:</h2> 

     <ul> 
     <% @site_group.errors.full_messages.each do |message| %> 
     <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :name %><br> 
    <%= f.text_field :name %> 
    </div> 
    # the @sites will also print the class, I would like to show the :name of the Site 
    <%= f.select :sites, 
    @sites, 
    {}, 
    {multiple: true, size: 10} 
    %> 


    <div class="field"> 
    <%= f.label :library %> 
    <%= f.text_field :library %> 
    </div> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

如何才能使更新工作並顯示名稱,如果選擇字段中的網站?

+0

通過更新作品我的意思是鋼軌給我沒有錯誤,並更新所有其他參數,但不是':site' – bnassler

+0

所以,有兩個問題:1)顯示網站的名稱。 2)更新網站。它是否正確? –

+0

@孫尼克:沒錯! – bnassler

回答

0

爲了顯示站點的名稱,使用集合選擇標籤如下:

<%= f.fields_for :sites do |s| %> 
    <%= s.collection_select :sites, 
     @sites, 
     :id, 
     :name, 
     {}, 
     {:multiple: true, size: 10} 
    %> 
<% end %> 

這是根據documentation on collection select.

collection_select(對象,方法,收集,value_method,text_method ,options = {},html_options = {})public

您還可以check this other answer for more information.

+0

謝謝,現在顯示名稱,我可以保存但沒有任何反應。含義保存成功,但不會更改siteGroup。如果我檢查siteGroup沒有引用...你知道爲什麼嗎? – bnassler

+0

我不明白 –

+0

SiteGroup不更新其網站「財產」或參考。我設置它,並點擊更新,但仍然沒有得到保存 – bnassler