我试图允许用户创建广告系列,因为他们选择了某个餐馆, 模型是:
class Restaurant < ActiveRecord::Base
belongs_to :user
validates :user_id, presence: true
has_many :campaigns, dependent: :destroy
end
class Campaign < ActiveRecord::Base
belongs_to :restaurant
end
也就是说,我在“广告系列”控制器中有方法可以创建新的广告系列,然后进行构建(下方)。
def new
if signed_in?
# create new campaign
@campaign = Restaurant.find(params[:id]).campaigns.new
else
redirect_to signin_path
end
end
def create
@campaign = Restaurant.find(params[:restaurant_id]).campaigns.build(campaign_params)
if @campaign.save
flash[:success] = "Campaign created!"
redirect_to current_user
else
render 'new'
end
end
用户在应用中的进度主要是:在用户点击的餐馆展示页面上创建广告系列,访问广告系列控制器中的new
方法。
新广告系列的视图如下,可以看出它接受来自@campaign
的{{1}}。
new
当我尝试提交表单时,<h1>New Campaign</h1>
<div class="row">
<div class="span6 offset3">
<%= nested_form_for @campaign do |f| %>
<%= render 'parameters', f: f %>
<div class="span6 pull-right" style="text-align:right">
<%= f.submit "Submit", class: "btn btn-large btn-primary" %>
</div>
<% end %>
</div>
</div>
上的广告系列控制器create
方法出现错误{1}}
如图所示,该广告系列属于在广告系列模型字段中具有ID的餐馆:restaurant_id
如何通过餐馆ID传递这项工作,以便创建广告系列?
答案 0 :(得分:1)
要向表单添加参数,请使用提交标记正上方的hidden_field帮助程序:
<%= f.hidden_field :restaurant_id, @campaign.restaurant.id %>
<%= f.submit "Submit", class: "btn btn-large btn-primary" %>
这应该在控制器的create方法中可用:
params["campaign"]["restaurant_id"]
如果由于某种原因希望它只是作为params [“id”]进入,你需要像这样使用hidden_field_tag:
<%= hidden_field_tag :id, @campaign.restaurant.id %>
附注 - 为了进行调试,您应该使用名为“pry”的调试工具。这会改变你的生活。
只需添加到您的Gemfile:
gem 'pry'
然后捆绑并重启服务器:
bundle
rails s
然后将“binding.pry”放在任何你想要的地方(在视图,模型,助手或控制器中) - 服务器将在你放置binding.pry的地方暂停,你可以在服务器控制台中找到它
我会将binding.pry放在你的create方法中:
def create
binding.pry
# rest of code here
end
然后像平常一样提交表格,并检查终端中的服务器屏幕......你应该看到Pry提示。
类型:
params
查看通过表单提交的所有参数。 要退出,请键入exit或ctrl + c
请记住在完成后删除binding.pry !!!