[英]Rails assign id in model
我想將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 %>
我認為您控制器的create
函數缺少params[:id]
。
修復最簡單的方法是將其添加到表單中:
<%= form_for(@registration, remote: true) do |f| %>
<%= hidden_field_tag :id, your_event_option_id %>
### your other stuffs
該錯誤清楚地表明,Rails在沒有id
情況下無法找到EventOption
:
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
中的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]
(如您params[:event_option_id]
傳遞給控制器:
#app/controllers/registrations_controller.rb
class RegistrationsController < ApplicationController
def create
@event_option = EventOption.find params[:event_option_id]
end
end
提示-您可以一次聲明多個資源 :
#config/routes.rb
resource :cart, only: [:show]
resources :orders, :order_items, :registrations, :event_options, :events, :charges
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.