提交后处理控制器中的select_tags

时间:2015-12-01 21:33:41

标签: ruby-on-rails ruby html-select

试图弄清楚如何使用

部分

3.2选择处理模型的方框 http://guides.rubyonrails.org/form_helpers.html

用我深深嵌套的模型。 (提供者可以拥有提供者位置,这是提供者ID和组locationid的连接。组位置是组和地址)。这是一种嵌套方式,如果用户以这种方式添加/删除位置,我将如何处理/使用这些选择框中的数据。

enter image description here

这将获取所有组位置并列出它们,并允许我将它们添加到proivder_locations下的当前提供程序。

基本上得到的工作是“愚蠢的”'在f.submit上的控制器端

流程是:

用户创建提供商,然后显示它是否要将位置添加到新创建的提供商。 如果是这样,它们需要add_location.html.erb文件,它们有两个选择框。一个包含他们可以添加的所有位置和一个 它显示了提供商已有的任何当前位置。

我有页面处理显示正确的位置和那个和 处理表单添加/删除。这很好,但是form_for中断(见下),即便如此,我也不知道如何处理或处理这些select标签中客户端的数据。我会以某种方式在控制器中消耗它吗? 3.2节再次讨论了它,但真正让我感到困惑的是它在3.2节中看起来并不适用于我的模型。

(旁注,我在那里没有真正经过测试的f.form_for,没有它,在html方面的列表中添加减去按钮的表单效果很好, 当我点击任何按钮添加/删除列表中的内容时,它会中断 (底部显示错误屏幕)

所有代码:

Provider.rb

class Provider < ActiveRecord::Base

    validates :first_name, presence: true
    validates :last_name, presence: true
    #validates :credentialing_contact, presence: true

    has_many :provider_locations
    has_many :group_locations, through: :provider_locations
    has_many :groups, through: :group_locations 
    belongs_to :designation
    belongs_to :specialty
    #has_many :provider_locations
    has_many :invoices
    has_many :provider_terms
end

provider_location.rb

class ProviderLocation < ActiveRecord::Base
  belongs_to :provider  
  belongs_to :group_location

end

group_location.rb

class GroupLocation < ActiveRecord::Base  
  belongs_to :address
  belongs_to :group
  has_many :provider_locations
end

providers_controller.rb

class ProvidersController < ApplicationController
    before_action :set_provider, only: [:show, :edit, :update, :destroy]


  def index
    @providers = Provider.all
  end

  def show
    #@provider = Provider.find(params[:id])
  end

  def new
    @provider=Provider.new

     respond_to do |format|
        format.html # new.html.erb
        format.json { render json: ghouse }
      end

  end

  def edit
  end

  def add_location
    @provider = Provider.find(params[:id])
    @group_locations = GroupLocation.all
    if @provider.nil?
      puts 'Error here!'
    end
    #throw an error if the provider is nil

  end

  def create
    @provider = Provider.new(provider_params)

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

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

  # DELETE /groups/1
  # DELETE /groups/1.json
  def destroy
    #@group = Group.find(params[:id])
    #if(@group.present?)
    #   @group.destroy
    #end
    @provider.destroy
    respond_to do |format|
      format.html { redirect_to providers_url, notice: 'provider was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_provider
      @provider = Provider.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def provider_params
      params.require(:provider).permit(:last_name, :first_name, :dob, :license_num, :license_exp, :dea_num, 
        :dea_exp, :ptan, :caqh_num, :provider_npi, :effective_date, :provisional_effective_date, :date_joined, 
        :provider_contact, :credentialing_contact, :hospitalaffiliation, :group_id, :specialty_id, :designation_id, :notes, :created_at, :updated_at)    
    end
end

(add_location.html.erb这是从节目控制器获得的)

<div class="container">
<div class="row">
  <%= form_for (@provider) do |f| %>
    <div class="col-md-4">
            <table>
              <tr>
                <th>            
                  <h3> <%= @provider.last_name %> , <%= @provider.first_name %> 's Locations</h3>
                </th>
              </tr>
              <tr>
                <td>          
                 <% if @provider.provider_locations.count >0 %>
                    <%= select_tag "provider_locations", options_from_collection_for_select(@provider.provider_locations.map{|j| j.group_location}, :id , :dba), :multiple => true %>
                  <% else %>
                    <%= select_tag "provider_locations", "<option></option>".html_safe, :multiple => true, :style => "width: 300px" %>       
                  <% end %>
                </td>
              </tr>
              <tr>
                <td>          
                   <button class="remove">Remove</button> 

                </td>
                <td>          
                  <button class="removeAll">Remove All</button>
                </td>
              </tr>
            </table>         
    </div>
    <div class="col-md-4">
         <table>
              <tr>
                <th>            <!-- maybe some buttons here -->

                </th>
              </tr>                   
            </table>
     </div>
     <div class="col-md-4">
            <table>
              <tr>
                <th>            
                 <h3> All Group Locations </h3> <!-- might need a search here too -->
                </th>
              </tr>
              <tr>
                <td>          
                  <% if @group_locations.count >0 %>
                    <%= select_tag "group_providers", options_from_collection_for_select(GroupLocation.all, :id , :dba), :multiple => true %>
                  <% else %>
                    <%= select_tag "group_providers", "<option>Add new...</option>".html_safe, :multiple => true, :style => "width: 300px" %>       
                  <% end %>

                </td>
              </tr>
              <tr>
                <td>          
                    <button class="add">Add</button>

                </td>
                <td>          
                    <button class="addAll">Add All</button>
                </td>
              </tr>
            </table>        
    </div>
    <div class="actions">
      <%= f.submit %>
    </div>
  <% end %>
  </div>
</div>

第二个问题,form_for通常会破坏我的代码:

enter image description here

1 个答案:

答案 0 :(得分:1)

我非常确定您在尝试提交时出现错误的原因是因为您提交的内容正在尝试进行更新操作(因为您的参数&#39; _method& #39;是补丁&#39;)。当它到达那里它就会命中

if @provider.update(provider_params)

将其定向到您的provider_params方法。此方法旨在仅允许某些参数,主要是提供者及其相关信息(由&#39;:提供者&#39;符号表示)。由于该信息不存在,因此会停止提交和错误。有几种方法可以解决这个问题。

  1. 让您的form_for提交给其他控制器操作(Routing form submission to a different controller
  2. 更改您的更新操作以支持缺少提供商参数
  3. 就我个人而言,我推荐第一个选项,尽管它已经脱离了rails REST架构。

    至于处理数据,如果我理解正确,你试图在提供者和group_location(即provider_location)之间创建链接。忘记对象可能需要的任何其他内容肯定需要

    1. 提供商的ID
    2. group_location的id
    3. 我相信你已经在你的参数中通过了,假设&#39; id&#39;是指您的提供商的ID和&#39; group_providers&#39;是group_location id的数组(如果它不是那么你需要使用form_for来获取参数中的信息,因为你需要它)。然后,它就像循环遍历group_location id并使用group_location id和提供者ID创建provider_location一样简单。

      params[:group_providers].each do |g_id|
         # using 'find_or_create_by' may be unnecessary but
         # can help avoid duplicate entries
         ProviderLocation.find_or_create_by(provider_id: params[:id].to_i, group_location_id: g_id.to_i)
      end
      

      注意:如果通过的ID意味着反映provider_location的确切状态(即,如果您提交时也想要删除当前存在但未包含哪些ID的提供者位置) (参考)然后循环在算法上变得非常复杂,所以如果你正在尝试做什么让我知道并且我会尝试帮助