找不到没有id的餐馆,如何提交表格和传递参数

时间:2014-09-12 02:37:04

标签: ruby-on-rails rails-activerecord

我试图允许用户创建广告系列,因为他们选择了某个餐馆, 模型是:

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传递这项工作,以便创建广告系列?

1 个答案:

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