我正在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%>
我想发布用户从表单下拉列表中选择的现有包。
答案 0 :(得分:0)
@@wizard == true
为什么使用类变量?它在您的Rails应用程序流程中没有先例
<强>控制器强>
我觉得你的整个流程效率低下且繁琐;你正在调用与当前对象无关的控制器动作,这就是为什么你会感到困惑的原因。
例如......
purchase_package
中touch_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;高效流动。
如果你更新/评论更多细节,我很乐意更新我的答案。