2015-10-08 25 views
1

我在touch_books_controller中創建purchase_package的對象,然後呈現build_purchase_package表單。如何指定哪個對象在窗體中張貼在導軌上

touch_books_controller.rb

  if @@wizard == true 
      create_pricings(@touch_book) 
      format.html { render :build_purchase_package } 
     else 
      format.html{ render :show} 
     end 

     def create_pricings(touch_book) 
      @price = Pricing.new(touch_book_id: @touch_book.id) 
      @price.save! 
      @purchase_package = PurchasePackage.new 
     end 

     def build_purchase_package 
      @@wizard = false 
     end 

形式將張貼到create動作在purchase_package_controller

形式

<%= simple_form_for(@purchase_package, wrapper: :vertical_input_group, 
    wrapper_mappings: { 
    check_boxes: :horizontal_radio_and_checkboxes, 
    radio_buttons: :horizontal_radio_and_checkboxes, 
    file: :horizontal_file_input}) do |f| %> 
    <% if @purchase_package.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@purchase_package.errors.count, "error") %> 
     prohibited this touch_book from being saved:</h2> 

     <ul> 
     <% @purchase_package.errors.full_messages.each do |message| %> 
      <br/> 
      <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

<% if !(@price.nil?) %> 

<%= hidden_field_tag :price_id, @price.id %> 

<% end %> 

    <div class="form-inputs"> 
    <br/> 
    <%= f.label 'Select one' %> 
    <br/> 
    <input id="new" type="radio" value="new" checked="checked"/>New 
    <br/> 
    <input id="existing" type="radio" value="new" />Existing 
    <br/> 
    <br/> 

    <div class="existing" style="display: none"> 
     Choose existing package 
     <%= f.collection_select :id, PurchasePackage.order(:id), :id, :title%> 
     <%#*post the package selected from the dropdown above%> 
     <br/> 
     <br/> 
    </div> 

    <div class="new"> 
     <%= f.input :title %> 

     <br/> 
     <br/> 
     <br/> 
     <%= f.input :price_tier_id %> 

     <br/> 
     <br/> 

     <br/><br/> 
     <div class="row"> 
      <div class="col-md-5"> 
      <%= f.input :start_date %> 
      </div> 

      <div class="col-md-5"> 
      <%= f.input :end_date %> 
      </div> 

      <br/> 
      <div class="col-md-5"> 
      <%= f.input :iap_product_identifier %>  
      </div> 
     </div> 

      <br/> 
      <%= f.input :published %> 
    </div> 

     <%= simple_fields_for(@touch_book) do |t| %> 
      <%= t.input :previewable_pages %> 
     <%end%> 
     <br/> 

     <div class="submit-btn"> 
      <%= f.submit :Submit, class: 'btn btn-primary' %> 
     </div> 

    <%end%> 

我想張貼用戶從選擇現有包在表單中下拉。

+0

需要牢記的一點是,您不會從表單中發佈**對象**,您只需發佈**參數**,即簡單的文本位。通常,如果你想讓用戶選擇一個包,那麼你將有一個名爲「package_id」的選擇,或者可能是「purchase_package [package_id]」,如果「package_id =」是一個你想在PurchasePackage對象上調用的方法,在控制器中。 –

回答

0
@@wizard == true 

爲什麼使用類變量?它會在你的Rails沒有先例的應用程序流


控制器

我覺得你的整個流程是低效和繁瑣;你正在調用與當前對象無關的控制器動作,這就是爲什麼你會感到困惑的原因。

例如...

touch_books_controllerpurchase_package對象,然後渲染build_purchase_package

你爲什麼渲染兩個獨立的控制器一個purchase_package

-

你會用最好的類似以下內容:

#app/models/package.rb 
class Package < ActiveRecord::Base 
    has_many :purchases 
end 

#app/models/purchase.rb 
class Purchase < ActiveRecord::Base 
    belongs_to :package 
end 

這是一個例子;我告訴所有人(特別是初學者),因爲Rails是對象,所以您需要從客觀角度思考功能。

你的問題是你的對象(purchase_package)真的應該創建在PurchasesController,允許你完全保留它的代碼在它自己的範圍內。

雖然這可能是整個案件(你可以有你的理由了分崩離析的功能),現在看來,從您的使用@@class_variable的,而你無法通過表單傳遞特定的數據,你遇到antipattern

-

形式將發佈到創建行動在purchase_package_controller

因此,如果你重新排列你的系統有點,你能得到它的工作:

#app/controllers/packages_controllers.rb 
class Packages < ApplicationController 
    def new 
     #logic here for touch_book 
     @purchase = Purchase.new 
     @package = @purchase.build_package 
    end 

    def create 
     @purchase = Purchase.new 
     @package = @purchase.new package_params 
    end 

    private 

    def package_params 
     params.require(:package).permit(:x, :y, :z) 
    end 
end 

#app/views/packages/new.html.erb 
<%= form_for @package do |f| %> 
    <%= f.collection_select :purchase_id, PurchasePackage.order(:id), :id, :title %> 
    <%= f.submit %> 
<% end %> 

這不是答案,但希望能告訴你一個傳統過程是如何工作的。

目前,您的系統專注於功能。因此,它是隨意的和不相容的;如果您專注於創建&填充對象,您將有機會創建一個簡單的&高效流程。


如果您更新/評論更具體,我會很樂意更新我的答案。