如何从表单中指定要在rails中发布的对象

时间:2015-10-08 07:53:00

标签: ruby-on-rails

我正在purchase_package中创建touch_books_controller的对象,然后呈现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%>  

我想发布用户从表单下拉列表中选择的现有包。

1 个答案:

答案 0 :(得分:0)

@@wizard == true

为什么使用类变量?它在您的Rails应用程序流程中没有先例

<强>控制器

我觉得你的整个流程效率低下且繁琐;你正在调用与当前对象无关的控制器动作,这就是为什么你会感到困惑的原因。

例如......

  

purchase_packagetouch_books_controller的对象,然后呈现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是 object ,所以你需要从客观的角度思考功能。

您的问题是您的对象(purchase_package)应该真正在PurchasesController中创建,允许您将其代码完全保留在自己的范围内。

虽然这可能是整个案例(您可能有理由将您的功能分开),但似乎您使用了@@class_variable并且无法通过您表单中的某些数据表明您遇到antipattern

-

  

表单将发布到purchase_package_controller

中的create动作

因此,如果你稍微调整一下你的系统,你就可以让它运转起来:

#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 %>

这不是答案,但希望能够向您展示传统流程的工作原理。

目前,您的系统专注于功能。结果,这是偶然的,不相容的;如果你专注于创造&amp;填充对象,您将有机会创建一个简单的&amp;高效流动。

如果你更新/评论更多细节,我很乐意更新我的答案。