我想将event_option_id分配给注册。通过将其添加到表单中,我可以轻松地在视图中执行此操作:
<%= f.text_field :event_option_id, value: @event_option.id %>
我想在不在视图中的模型中执行此操作。为了安全起见,我对注册价格做了同样的事情。从模型中设置价格是有效的,但对event_option_id做同样的事情却不是。
注册模式:
class Registration < ActiveRecord::Base
belongs_to :event_option
belongs_to :order_item
belongs_to :order
before_save :set_event_options
def order_present
if order.nil?
errors.add(:order, "is not a valid order.")
end
end
def registration_price
self[:price] = event_option.price
end
def event_option_id
self.event_option_id = event_option
end
private
def set_event_options
self[:price] = registration_price
self.event_option_id = event_option_id
end
end
EventOptions模型:
class EventOption < ActiveRecord::Base
belongs_to :event
has_many :registrations
end
在注册控制器中创建方法:
def create
@event_option = EventOption.find(params[:id])
@order = current_order
@registration = @order.registrations.build(registration_params)
#@registration = Registration.new(registration_params)
@order_id = current_order.id
respond_to do |format|
if @registration.save
format.html { redirect_to @registration, notice: 'Registration was successfully created.' }
format.json { render :show, status: :created, location: @registration }
format.js {}
@order.save
session[:order_id] = @order.id
else
format.html { render :new }
format.json { render json: @registration.errors, status: :unprocessable_entity }
end
end
日志错误:
Started POST "/registrations" for 127.0.0.1 at 2016-01-04 21:16:06 -0500
Processing by RegistrationsController#create as JS
Parameters: {"utf8"=>"âo"", "registration"=>{"name"=>"saasas", "lastname"=>"asas"}, "commit"=>"Create Registration"}
EventOption Load (0.0ms) SELECT "event_options".* FROM "event_options" WHERE "event_options"."id" = ? LIMIT 1 [["id", nil]]
Completed 404 Not Found in 8ms (ActiveRecord: 0.0ms)
ActiveRecord::RecordNotFound (Couldn't find EventOption with 'id'=):
app/controllers/registrations_controller.rb:27:in `create'
Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/_source.erb (0.0ms)
Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb (0.0ms)
Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb (1.0ms)
Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb (44.0ms)
Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/web-console-2.2.1/lib/web_console/templates/_markup.html.erb (1.0ms)
Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/web-console-2.2.1/lib/web_console/templates/_inner_console_markup.html.erb within layouts/inlined_string (0.0ms)
Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/web-console-2.2.1/lib/web_console/templates/_prompt_box_markup.html.erb within layouts/inlined_string (0.0ms)
Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/web-console-2.2.1/lib/web_console/templates/style.css.erb within layouts/inlined_string (0.0ms)
Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/web-console-2.2.1/lib/web_console/templates/console.js.erb within layouts/javascript (48.0ms)
Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/web-console-2.2.1/lib/web_console/templates/main.js.erb within layouts/javascript (0.0ms)
Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/web-console-2.2.1/lib/web_console/templates/error_page.js.erb within layouts/javascript (0.0ms)
Rendered C:/RailsInstaller/Ruby2.1.0/lib/ruby/gems/2.1.0/gems/web-console-2.2.1/lib/web_console/templates/index.html.erb (105.0ms)
我正在阅读rails文档的这一部分: http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html, 但仍然无法弄清楚最新情况。
更新
路线:
Rails.application.routes.draw do
resource :cart, only: [:show]
resources :orders
resources :order_items
resources :registrations
resources :event_options
resources :events
resources :charges
root 'events#index'
注册表单 - 在event_option内部show.html.erb:
<%= form_for(@registration, remote: true) do |f| %>
<% if @registration.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@registration.errors.count, "error") %> prohibited this registration from being saved:</h2>
<ul>
<% @registration.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :lastname %><br>
<%= f.text_field :lastname %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
答案 0 :(得分:0)
我认为您的控制器的create
功能缺少params[:id]
。
最简单的解决方法是将其添加到表单中:
<%= form_for(@registration, remote: true) do |f| %>
<%= hidden_field_tag :id, your_event_option_id %>
### your other stuffs
答案 1 :(得分:0)
该错误明确指出Rails在没有EventOption
的情况下无法找到id
:
def create
@event_option = EventOption.find params[:id] #-> :id is not passed to create action
要解决此问题,只需使用作为表单一部分提交的param
:
#app/controllers/registrations_controller.rb
class RegistrationsController < ApplicationController
def create
@order = current_order
@registration = @order.registrations.new registration_params
@registration.save
end
private
def registration_params
params.require(:registration).permit(:event_option_id, :other, :params)
end
end
-
如果用户可以在表单中选择event_option_id
,则上述操作会很好;如果您使用的是hidden_field
,那么您最好使用nested routes
:
#config/routes.rb
resources :event_option do
resources :registrations #-> url.com/event_options/:event_option_id/registrations/new
end
这会将event_option_id
设置为顶级params散列的一部分,它将作为params[:event_option_id]
传递给控制器(正如您已经拥有的那样):
#app/controllers/registrations_controller.rb
class RegistrationsController < ApplicationController
def create
@event_option = EventOption.find params[:event_option_id]
end
end
提示 - 您可以立即declare multiple resources:
#config/routes.rb
resource :cart, only: [:show]
resources :orders, :order_items, :registrations, :event_options, :events, :charges