我有一个has_one through关系,条件是连接我的应用中的旅程和地址。每次旅行都有两个地址:起点和目的地。地址可用于许多不同的旅程,可以是起点或目的地。
在应用程序中,行程和地址通过名为TripLocation的模型连接,该模型作为布尔列“目标”设置地址是否作为行程的目的地。要查看有关该关系的更多信息,请参阅我之前提出的有关相同应用的问题: Has_many through in Rails while assigning different roles
我希望应用用户在创建旅行时从原点和目的地的可能地址列表中进行选择。这就是我所拥有的,我知道这是不对的:
<%= simple_form_form (@trip) do |f| %>
<%= f.error_notification %>
<%= f.input :origin, collection: Address.all, label_method: :kind, value_method: :id, label: "Starting address" %>
<%= f.input :destination, collection: Address.all, label_method: :kind, value_method: :id, label: "Ending address" %>
#other trip things here like date and time
<% end %>
(最终我将限制Address.all的地址选择,但现在我希望这个版本能够正常工作。)
当我尝试从此表单提交时,我收到以下错误消息:
NoMethodError in TripsController#create
undefined method 'id' for "1":String
所以这似乎是期望有一个对象(带有id)而不是包含对象id的字符串。我知道数据库中应该出现哪些新条目以正确连接所有内容,但我不确定如何使用rails来实现目标,并且我很感激任何信息都指向了正确的方向。
编辑: 以下是trips_controller中的create动作的代码:
def create
@trip = Trip.new(trip_params)
if @trip.save
redirect_to @trip, notice: 'Trip was successfully created.'
else
render action: 'new'
end
end
由于这是Rails 4,trip_params是以下私有方法:
def trip_params
params.require(:trip).permit(:origin, :destination, :pickup_date, :pickup_time, :dropoff_date, :dropoff_time, :user_id, :company_profile_id, :vehicle_id)
end
现在我想知道是否需要在控制器中构建一个新的TripLocation对象,然后使用嵌套的表单同时进行Trip和TripLocation?