使用控制器构建视图但在rails中没有模型

时间:2015-10-25 07:39:43

标签: jquery ruby-on-rails ruby

我可能接近这个错误,但我有一个名为Location的模型,一个位置是一个名称......一个group_id(来自模型Group)和一个{{1 (来自address_id模型)。流程是:

用户选择要添加位置的组。用户可以添加位置的页面,具有先前选择的组,位置名称的输入框和可用地址列表,还可以添加新地址(可以将您带到不同的页面,呈现通过对应于Address模型的控制器的新动作。我也必须做其他类似的其他事情。所以搞清楚这一点会有很大帮助。让我兴奋的部分是:

我确信我可以弄清楚如何让选择的地址框工作,我会有这个组,所以我会有一个组ID和地址ID,然后只需创建名称输入的GroupLocation。

问题是,当要添加新地址时,因为表单存在于不同的页面中(如上所述),在提交地址时,控制器如何知道除了创建地址之外,创建的地址地址最终将用于新地点的选定组。

1 个答案:

答案 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 %>

我希望这能指出你正确的方向。如果您仍有疑问,请在评论中提问。