我试图在Ruby on Rails(v.3.2.13)上做一个小餐馆网站。
我制作了3个表:客户(姓名,电子邮件),预订(customer_id,table_id),表格(座位,区域)。
我的模特看起来像这样。
class Reservation < ActiveRecord::Base
belongs_to :customer
belongs_to :table
end
class Customer < ActiveRecord::Base
has_many :reservations
has_many :tables, :through => :reservations
end
class Table < ActiveRecord::Base
has_many :reservations
has_many :customers, :through => :reservations
end
我做了一个表格来搜索合适的表格。如果客户找到他的桌子,他点击一个按钮进行预订。此按钮可指向“添加新客户”视图。按钮看起来像这样:
<%= button_to "Book table #{table.id}" , customers_path(:table_id => table) %>
在CustomerController
中,我编辑了以下创建方法:
def create
@customer = Customer.new(params[:customer])
table = Table.find(params[:table_id])
respond_to do |format|
if @customer.save
format.html { redirect_to @customer, notice: 'Customer was successfully created.' }
format.json { render json: @customer, status: :created, location: @customer }
@reservation = @customer.reservations.build(table: table).save!
else
format.html { render action: "new" }
format.json { render json: @customer.errors, status: :unprocessable_entity }
end
end
end
可悲的是,“Table.find”不起作用。当我使用“Table.first”时,会添加一个Reservation,但是当我使用上面的表时,我收到消息:“找不到带有id =的表”。但是,我可以在NewCustomer视图中显示ID。
为什么create
方法中的ID不可用?
编辑:
以下是搜索表格的主页的表单。此外,我不得不说我为表搜索创建了一个新的资源主页。
<%= form_tag mainpages_path, :method => 'get' do %>
<p>
How many persons: <br/><%= number_field_tag(:search) %> <br/>
Date: <%= date_select :date, 'Date', use_short_month: true, order: [:day, :month, :year] %> <br/>
Beginn: <%= time_select :Beginn, 'Beginn' , default:Time.now %> <br/>
End : <%= time_select :Ende, 'Ende' , default: Time.now + 2.hours %> <br/>
<%params[:search]%>
<%= submit_tag "Search" %>
</p>
<% end %>
<% if @tables %>
<h2>Folgende Tische stehen zur Auswahl</h1>
<% @tables.each do |table| %>
<div class="entry" >
<h3>Seats: <%= table.seats %></h3>
<h3>Area: <%= table.area %></h3>
<%= link_to "Book this table #{table.id}" , new_customer_path(:table_id => table) %>
</div>
<% end %>
<% else %>
<p> Pls choose a table</p>
<% end %>
EDIT2: HTML-Code的链接:
<a href="/customers/new?table_id=1" mode="post">Book this table 1</a>
这是客户/新视图的HTML代码:
<!DOCTYPE html>
<html>
<head>
<title>Restaurant</title>
<link href="/assets/application.css?body=1" media="all" rel="stylesheet" type="text/css" />
<link href="/assets/customers.css?body=1" media="all" rel="stylesheet" type="text/css" />
<link href="/assets/mainpages.css?body=1" media="all" rel="stylesheet" type="text/css" />
<link href="/assets/reservations.css?body=1" media="all" rel="stylesheet" type="text/css" />
<link href="/assets/scaffolds.css?body=1" media="all" rel="stylesheet" type="text/css" />
<link href="/assets/tables.css?body=1" media="all" rel="stylesheet" type="text/css" />
<script src="/assets/jquery.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery_ujs.js?body=1" type="text/javascript"></script>
<script src="/assets/customers.js?body=1" type="text/javascript"></script>
<script src="/assets/mainpages.js?body=1" type="text/javascript"></script>
<script src="/assets/reservations.js?body=1" type="text/javascript"></script>
<script src="/assets/tables.js?body=1" type="text/javascript"></script>
<script src="/assets/application.js?body=1" type="text/javascript"></script>
<meta content="authenticity_token" name="csrf-param" />
<meta content="ej1MgV2fad014SLkCv3dZXl8TknQH4JHZLoe56Xn/Kk=" name="csrf-token" />
</head>
<body>
<h1>New customer</h1>
<form accept-charset="UTF-8" action="/customers" class="new_customer" id="new_customer" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /><input name="authenticity_token" type="hidden" value="ej1MgV2fad014SLkCv3dZXl8TknQH4JHZLoe56Xn/Kk=" /></div>
<div class="field">
<label for="customer_name">Name</label><br />
<input id="customer_name" name="customer[name]" size="30" type="text" />
</div>
<div class="field">
<label for="customer_email">Email</label><br />
<input id="customer_email" name="customer[email]" size="30" type="text" />
</div>
<input id="table_id" name="table_id" type="hidden" />
<div class="actions">
<input name="commit" type="submit" value="Create Customer" />
</div>
</form>
<a href="/customers">Back</a>
</body>
</html>
答案 0 :(得分:1)
控制器中的更改(只需添加@符号)
@table = Table.find(params[:table_id])
在视图中
<%= button_to "Book table #{table.id}" , customers_path(:table_id => @table) %>
答案 1 :(得分:1)
试试这个
<%= button_to "Book table #{table.id}" , customers_path(:table_id => table), method: :post %>
答案 2 :(得分:0)
这里的问题是使用button_to
...
来自Url Helpers文档:
Generates a form containing a single button that submits to the URL created by the set of options.
表单的action属性需要与此类似:
/customers/new?table_id=<table_id>
单击此按钮时,它应路由到呈现new
视图的客户new
操作。您需要将table_id
传递到new
视图,然后将其添加到您的客户表单中。像这样:
def new
...
@table_id = params[:table_id]
end
然后,当您提交将转到form
操作的客户create
时,您应该可以访问params[:table_id]
答案 3 :(得分:0)
根据您发布的最后一段代码,您需要:
<%= link_to "Book this table #{table.id}" , customer_path(:table_id => table), mode: :post %>
答案 4 :(得分:0)
你好100万次尝试后我发现了这个错误!使用hidden_field_tag的解决方案部分正确。我一直试着<%= hidden_field_tag :table_id %>
。但是使用此代码,create动作知道变量:table_id
,但它有一个空字符串。现在我将params[:table_id]
添加到hidden_field,现在可以使用变量:table_id
的值。
长篇故事简短,变量名称和值必须在hidden_field_tag
!
<%= hidden_field_tag :table_id, params[:table_id] %>
感谢所有试图帮助我的人!