如何以多种forms访问多个模型
首先,我要感谢所有人。 在过去的几天里,我得到了很多人的帮助,非常感谢!
我手上还有另一个问题:
背景/目标:
我有一个Tour,Day和Reservation模型。 在我的Tour控制器中,我可以创建一个游览并在游览可用的日子里手动输入。 然后我想访问每个旅游预订页面(旅游/ 1 /预订/新)并显示旅游信息以及旅游指定日期。
我的问题是:
1)我需要在预订控制器和视图中放置什么才能让我在选择标签中访问每个游览指定日期?
2)是否有一种Rails方式可以将输入的一周中的日期变为动态forms,其中显示指定的日期和日期?
例如:周一和周二(每周)可以使用Tour#1(这些是在我创建游览的几天内手动输入的)。 如何将这些日子转变为动态forms,其中Rails显示每个月的每个星期一和星期二的日期? (我可能会发布另一个问题,只是想知道,因为它有点相关。)
深刻的解释总是受到赞赏,因为我有点无能为力。 :( 再次感谢你!
更新:
如果他们在form_helper中,或者甚至像我将引导下拉菜单类应用于周围元素一样简单,那么每个游览的日期都不会显示在预订页面上。
这有效:(显示天数)
-
这不是:
或者这个:
我完全难过了。
楷模:
class Tour lambda { |a| a[:name].blank? }, :allow_destroy => true end class Reservation lambda { |a| a[:name].blank? }, :allow_destroy => true end class Day lambda { |a| a[:name].blank? }, :allow_destroy => true end
迁移:
class CreateTours <ActiveRecord :: Migration def change create_table:tours do | t | t.string:name t.integer:amount
t.timestamps end end end class CreateDays < ActiveRecord::Migration def change create_table :days do |t| t.string :name t.integer :tour_id t.timestamps end end end class CreateReservations < ActiveRecord::Migration def change create_table :reservations do |t| t.integer :passengers t.integer :tour_id t.integer :day_id t.timestamps end end end
浏览次数:
游览
Add a new tour
保留
控制器:
class ReservationsController @tour.amount, # amount in cents, again :currency => "usd", :card => params[:stripeToken] ) flash[:success] = "Your reservation has been booked for #{@reservation.passengers} person(s). Please save this info." redirect_to new_tour_reservation_path(@tour) else render 'new' end end private def reservation_params params.require(:reservation).permit(:date, :passengers, days_attributes: [:id, :name, :_destroy])
结束
class ToursController < ApplicationController def index @tours = Tour.all end def new @tour = Tour.new 7.times { @tour.days.build } end def create @tour = Tour.new(tours_params) if @tour.save flash[:success] = "Tour #{@tour.name} has been successfully added." redirect_to new_tour_path else flash[:error] = "The tour #{@tour.name} was not successfully saved. Please try again" render 'new' end end def show @tour = Tour.find_by(id: params[:id]) @reservation = Reservation.new end def edit @tour = Tour.find_by(id: params[:id]) end def update @tour = Tour.find_by(id: params[:id]) if @tour.update_attributes(tours_params) flash[:success] = "#{@tour.name} has been successfully updated." redirect_to tours_path else flash[:error] = "#{@tour.name} has not been updated. Please try again." render 'edit' end end def delete @tour = Tour.find_by(id: params[:id]) end def destroy @tour = Tour.find_by(id: params[:id]) if @tour.destroy flash[:success] = "The #{@tour.name} has been successfully deleted." redirect_to tours_path else flash[:error] = "The #{@tour.name} has not been deleted. Please try again." render 'edit' end end private def tours_params params.require(:tour).permit(:name, :amount, days_attributes: [:id, :name, :_destroy]) end end
路线:
Rails.application.routes.draw do resources :tours do resources :reservations end end
我觉得你真的很亲密。 您只需更新您的预订表单,即可包含与所选巡视相关联的天数的下拉列表:
<%= bootstrap_form_for([:tour, @reservation], html: { class: 'form-horizontal', id: 'payment-form'}) do |f| %> <%= f.fields_for :day do |builder| %> <%= builder.label :id, 'Days available:' %>
<%= builder.select :id, options_from_collection_for_select(@tour.days, 'id', 'name') %> <% end %>
此外,由于您知道您将加载与Tour相关联的Day对象,因此您可以在控制器中预加载这些对象以获得(微小的)性能提升:
class ReservationsController < ApplicationController def new @reservation = Reservation.new @tour = Tour.includes(:days).find(params[:tour_id]) # ^---- small performance improvement end
@tour.days
是一个数组,我相信。 你需要的是一个单一的实例。
看看这是否有效:
<% @tour.days.each do |day| %> <%= f.fields_for :day do |builder| %> <%= builder.label :id, 'Days available:' %>
<%= builder.select :id, options_from_collection_for_select(day, 'id', 'name') %> <% end %> <% end %>
如果你在API中查找options_from_collection_for_select
,你会注意到他们这个例子:
options_from_collection_for_select(@people, 'id', 'name')
@people
是一个单一的对象。 不是一个数组。 @tour.days
是一个数组