Rails在模型中分配id

时间:2016-01-05 02:15:51

标签: ruby-on-rails

我想将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 %>

2 个答案:

答案 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