我可能接近这个错误,但我有一个名为Location
的模型,一个位置是一个名称......一个group_id
(来自模型Group
)和一个{{1 (来自address_id
模型)。流程是:
用户选择要添加位置的组。用户可以添加位置的页面,具有先前选择的组,位置名称的输入框和可用地址列表,还可以添加新地址(可以将您带到不同的页面,呈现通过对应于Address
模型的控制器的新动作。我也必须做其他类似的其他事情。所以搞清楚这一点会有很大帮助。让我兴奋的部分是:
我确信我可以弄清楚如何让选择的地址框工作,我会有这个组,所以我会有一个组ID和地址ID,然后只需创建名称输入的GroupLocation。
问题是,当要添加新地址时,因为表单存在于不同的页面中(如上所述),在提交地址时,控制器如何知道除了创建地址之外,创建的地址地址最终将用于新地点的选定组。
答案 0 :(得分:1)
您可以将group_id
作为预先填充的隐藏表单字段传递。提交表单时,在控制器中提取该隐藏字段值,并在创建地址后,通过重定向将其作为查询参数传递给下一个控制器(位置控制器)。
addresses_controller.rb
class AddressesController < ApplicationController
def new
@address = Address.new
@group_id = params[:group_id] # This should be provided either as a route parameter or a query parameter.
end
def create
@address = Address.create! permitted_address_params
# the group_id parameter is obtained from hidden field of form
# which will be passed to the locations controller as a query
# parameter along with the id of newly created address.
redirect_to new_location_path(address_id: @address.id, group_id: params[:group_id])
end
private
def permitted_address_params
params.require(:address).permit(...fields from address ...)
end
end
locations_controller.rb
class LocationsController < ApplicationController
def new
@location = Location.new(address_id: params[:address_id], group_id: params[:group_id])
end
def create
@location = Location.create! permitted_location_params
end
private
def permitted_location_params
params.require(:location).permit(:group_id, :address_id, ...other location params ....)
end
end
地址/ new.html.erb
<%= form_for @address do |f| %>
<%= hidden_field_tag :group_id, @group_id %>
... other address fields ...
<% end %>
位置/ new.html.erb
<%= form_for @location do |f| %>
<%# This ensures that group_id and address_id are passed to the create action of locations controller %>
<%= f.hidden_field :group_id %>
<%= f.hidden_field :address_id %>
... other location fields ...
<% end %>
我希望这能指出你正确的方向。如果您仍有疑问,请在评论中提问。