试图弄清楚如何使用
部分3.2选择处理模型的方框 http://guides.rubyonrails.org/form_helpers.html
用我深深嵌套的模型。 (提供者可以拥有提供者位置,这是提供者ID和组locationid的连接。组位置是组和地址)。这是一种嵌套方式,如果用户以这种方式添加/删除位置,我将如何处理/使用这些选择框中的数据。
这将获取所有组位置并列出它们,并允许我将它们添加到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通常会破坏我的代码:
答案 0 :(得分:1)
我非常确定您在尝试提交时出现错误的原因是因为您提交的内容正在尝试进行更新操作(因为您的参数&#39; _method& #39;是补丁&#39;)。当它到达那里它就会命中
if @provider.update(provider_params)
将其定向到您的provider_params
方法。此方法旨在仅允许某些参数,主要是提供者及其相关信息(由&#39;:提供者&#39;符号表示)。由于该信息不存在,因此会停止提交和错误。有几种方法可以解决这个问题。
就我个人而言,我推荐第一个选项,尽管它已经脱离了rails REST架构。
至于处理数据,如果我理解正确,你试图在提供者和group_location(即provider_location)之间创建链接。忘记对象可能需要的任何其他内容肯定需要
我相信你已经在你的参数中通过了,假设&#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的提供者位置) (参考)然后循环在算法上变得非常复杂,所以如果你正在尝试做什么让我知道并且我会尝试帮助