- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,我有一个表格包,我通过表格填充并使用参数。该表具有到另一个表位置的 FK,该位置包含包裹的纬度、经度和地址。 Location 表使用 GeoKit。
我的表单包含包裹字段和允许用户输入位置名称的字段。 Google map 帮助用户使用自动完成功能填写详细信息,并将结果以 json 格式保存在隐藏字段中。
我正在尝试使用强参数作为
private
def package_params
params.require(:package).permit( :state, :delivery_date, :length, :height, :width, :weight, destination: [:id, :address, :lat, :lng], origin: [:id, :address, :lat, :lng] )
end
我也试过
private
def package_params
params.require(:package).permit( :state, :delivery_date, :length, :height, :width, :weight, destination_attributes: [:id, :address, :lat, :lng], origin_attributes: [:id, :address, :lat, :lng] )
end
但起点和终点的_attributes 不再在参数的包对象中传递。
封装模型为
class Package < ActiveRecord::Base
belongs_to :user
has_many :bids, dependent: :destroy
belongs_to :origin, :class_name => 'Location', :foreign_key => 'origin'
belongs_to :destination, :class_name => 'Location', :foreign_key => 'destination'
has_many :locations, autosave: true
accepts_nested_attributes_for :origin, :destination
....
end
位置模型是
class Location < ActiveRecord::Base
acts_as_mappable
validates :address, presence: true
validates :lat, presence: true
validates :lng, presence: true
end
创建方法是
def create
@package = current_user.packages.build(package_params)
if @package.save
......
end
package.save 失败。这是我收到的错误。
ActiveRecord::AssociationTypeMismatch in PackagesController#create Location(#70350522152300) expected, got String(#70350507797560)
我可以想到一些解决方法,但我想让它正常工作,所以我可以从中学习。我已经尝试阅读 rails api 并在谷歌上搜索了几天,但我一直无法让它工作。
帖子数据是
Parameters: {
"utf8"=>"✓",
"authenticity_token"=>"ZYkfpQBu6fvX7ZmzRw2bjkU+3i6mH0M7JLeqG4b99WI=",
"origin_input"=>"Kimmage, Dublin, Ireland",
"package"=>{
"origin"=>"{
\"address\":\"Kimmage, Dublin, Ireland\",
\"lat\":53.32064159999999,
\"lng\":-6.298185999999987}",
"destination"=>"{
\"address\":\"Lucan, Ireland\",
\"lat\":53.3572085,
\"lng\":-6.449848800000041}",
"length"=>"22",
"width"=>"222",
"height"=>"22",
"weight"=>"0 -> 5",
"delivery_date"=>"2014-10-31"},
"destination_input"=>"Lucan, Ireland",
"commit"=>"Post"}
我知道起点和终点没有被反序列化,但我不知道为什么没有。我是否必须手动反序列化字符串,我可以在 package_params 中执行此操作吗?
创建这个的表单如下
<%= form_for(@package, :html => {:class => "form-horizontal", :role => 'form'}) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<div class="form-group">
<input type="text" name="origin_input" placeholder="From" onFocus="geolocate(); autocompleteLocation(this,package_origin)" class="form-control" />
<%= f.hidden_field :origin, class: "form-control" %>
</div>
<div class="form-group">
<input type="text" name="destination_input" placeholder="Destination" onFocus="geolocate(); autocompleteLocation(this,package_destination)" class="form-control" />
<%= f.hidden_field :destination, class: "form-control" %>
</div>
<div class="form-inline form-group">
<div class="input-group col-md-3">
<%= f.text_field :length, placeholder: "L", class: "form-control" %>
<span class="input-group-addon">cm</span>
</div>
<div class="input-group col-md-3">
<%= f.text_field :width, placeholder: "W", class: "form-control" %>
<span class="input-group-addon">cm</span>
</div>
<div class="input-group col-md-3">
<%= f.text_field :height, placeholder: "H", class: "form-control" %>
<span class="input-group-addon">cm</span>
</div>
</div>
<div class="form-group input-group">
<p>Please select the weight range of your package, Weights are in kg</p>
<% options = options_from_collection_for_select(@weights, 'weight', 'weight') %>
<%= f.select :weight, options, class: "form-control dropdown" %>
</div>
<div class="form-group">
<%= f.date_field :delivery_date, class: "form-control" %>
</div>
<%= f.submit "Post", class: "btn btn-large btn-primary", id: "package_post" %>
<% end %>
<%= render 'shared/places_autocomplete' %>
最佳答案
您收到的错误 AssociationTypeMismatch
是由于将 origin:
和 destination:
放在您的 strong_params 中引起的。 Rails 认为您正在尝试像 @post.comment = @comment
那样关联对象。
即使对您的参数进行了适当的序列化和反序列化,这种方法也行不通。 Rails 会看到您当前使用 strong_params 的尝试:
# Not deserialized
@package.origin = '{ \"address\":\"Kimmage, Dulbin, Ireland\", ... }'
# Deserialized. However, this still won't work.
@package.origin = { address: "Kimmage, Dublin, Ireland", ...}
在这两种情况下,Rails 都需要一个对象。您可以通过使用正确反序列化的案例进入您的控制台来测试它:
$ rails c
irb(main): p = Package.new
irb(main): p.destination = { address: "Kimmage, Dublin, Ireland" } # => Throws ActiveRecord::AssociationTypeMismatch.
那么,为什么它不起作用?因为 Rails 不是将实际对象传递给它,而是将您传递的内容解释为字符串或散列。为了通过 strong_params 关联对象,Rails 查找并使用 accepts_nested_attributes
方法(您已尝试过)。但是,如下所述,这不适合您。
这里的问题是您尝试关联数据的方式。使用accepts nested attributes就是通过一个父对象来关联和保存子对象。在您的情况下,您正在尝试使用 accepts_nested_attributes_for 方法通过子对象(包)关联并保存两个父对象(起点和终点)。 Rails 不会以这种方式工作。
来自 docs 的第一行(强调我的):
Nested attributes allow you to save attributes on associated records through the parent.
在您的代码中,您试图通过 child 关联并保存/更新它。
您需要的是表单中的 origin_id
和 location_id
,从您的模型中排除 accepts_nested_attributes
,因为您不需要它,然后使用 ID 保存您的包裹:
params.require(:package).permit(:width, :length, :height, :whatever_else, :origin_id, :location_id)
然后,在提交表单之前使用 AJAX 请求将这两个位置的 origin_id
和 destination_id
插入到隐藏字段中。如果这些位置尚不存在,您可以使用 find_or_create_by 方法在检索时创建这些位置。
@destination & @origin
@origin
和 @destination
关联到 @package
您不需要为任何内容接受_nested_attributes_。您可以像往常一样保存包(确保修改 package_params)。
class PackagesController < ApplicationController
before_action :set_origin, only: [:create]
before_action :set_destination, only: [:create]
def create
@package = current_user.packages.build(package_params)
@package.destination = @destination
@package.origin = @origin
if @package.save
# Do whatever you need
else
# Do whatever you need
end
end
private
# Create the package like you normally would
def package_params
params.require(:package).permit( :state, :delivery_date, :length, :height, :width, :weight)
end
def set_origin
# You can use Location.create if you don't need to find a previously stored origin
@origin = Location.find_or_create_by(
address: params[:package][:origin][:address],
lat: params[:package][:origin][:lat],
lng: params[:package][:origin][:lng],
)
end
def set_destination
# You can use Location.create if you don't need to find a previously stored destination
@destination = Location.find_or_create_by(
address: params[:package][:destination][:address],
lat: params[:package][:destination][:lat],
lng: params[:package][:destination][:lng],
)
end
end
为确保您的包裹具有有效的始发地和目的地,然后在您的模型中进行验证:
class Package < ActiveRecord::Base
validates :origin, presence: true
validates :destination, presence: true
validates_associated :origin, :destination
end
关于json - Rails 嵌套属性不会从隐藏表单输入中的 JSON 字符串创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26474378/
我在 mongodb 中的玩家和锦标赛之间存在多对多关系。 我希望能够一次将许多玩家添加到锦标赛中。如果没有 ajax,这很简单,但我们有一个包含数千名玩家的数据库,因此表单选择变得巨大。 我们想为此
这个问题已经有答案了: When should I use html's and when spring's in Spring MVC web app? (3 个回答) 已关闭 6 年前。 我正
我正在 C++ Builder XE4 上使用 VCL。 我有以下组件。 FormMain 具有 TButton *B_select; FormSelect(或DialogSelect)具有 TCom
如何在不影响表单控件的情况下更改表单的 alphablend? 德尔福XE7 最佳答案 此问题的一个解决方案是使用多设备应用程序(如果无法使用VCL)。 如果您需要保留透明的TForm,只需更改属性T
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我正在尝试扩展 Django 注册以包含我自己的注册表单。原则上这是相当简单的。我只需要编写自己的表单( CustomRegistrationForm ),它是原始表单( RegistrationFo
我正在尝试为我的网站实现聊天功能。为了做到这一点,我遵循了以下教程:https://channels.readthedocs.io/en/latest/tutorial/ 然后我稍微更改了代码以实现它
有一个问题,我需要用一个 html 表单提交两个相互关联的模型表单。我知道如何提交两个单独的表格,但是在相关模型表格的情况下外键让我发疯。 问题是,第二个表单应该用外键填充字段到第一个表单的实例。 在
我正在创建一个工具,允许某人输入食谱,然后将其保存为 XML 文件,我已经创建了 XSD,但我想知道如何在我的网页上制作一个表单以允许用户输入他们的食谱并遵守模式。我一直在研究 Ajax 和 Jque
在 .net win 表单(如 asp.net web 表单)中是否有可用的验证控件? 因为很难为我的每个控件设置正确的条件,所以我的表单中也有很多重复的代码。 正确的做法是什么? 最佳答案 看看这个
我有一个简短的问题。我正在学习如何使用 javascript 制作注册表,发现此链接非常有用。 http://www.w3resource.com/javascript/form/javascript
我正在开发一个项目,该项目将使用循环将许多表单添加到 mysql 数据库中。在 javascript 部分中,我无法让 var i 在函数 updatesum() 中工作。有人可以帮我吗? 我试图避免
在我的应用程序上有一个包含 2 个字段和一个保存按钮的表单。 在我的 onClick 结束时我需要什么来将光标返回到第一个字段。 我有这个来清除它们 txtData.setText("
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
<input type="text" name="textfield" onKeyPress="javascript:alert(event.
我正在构建的网站有一个登录表单,作为所有其他模板扩展的 base.html 模板的一部分;因此,我需要以某种方式处理每个页面上的登录/注销逻辑。 目前每个页面都在单独的 View 中加载,那么实现它的
我有一个表单类,看起来像.. #forms.py class ExampleForm(forms.Form): color = forms.CharField(max_length=25)
有没有办法在表单定义中给表单一个特殊的错误渲染函数?在 customizing-the-error-list-format 下的文档中它展示了如何为表单提供特殊的错误呈现函数,但似乎您必须在实例化表单
我正在处理由多个页面组成的表单,我想解决验证问题。 当我点击提交按钮时,当前页面上的所有字段都会在下方显示错误消息,但是如果我更改页面,那么我需要再次点击提交,因为这些字段未设置为已触摸。 如果我可以
是否可以附加到继承表单的 exclude 或 widgets 变量? 到目前为止,我有以下设置。 class AddPropertyForm(forms.ModelForm): num_mon
我是一名优秀的程序员,十分优秀!