Hidden_​​field不使用ruby中的模型验证

时间:2015-07-06 12:05:04

标签: ruby-on-rails ruby

我的出价表单中有一个hidden_​​field,用于将post_id添加到出价中:

<%= f.hidden_field :post_id, :value => @post.id %> 

但是,当我向我的出价模型添加验证时 - 例如:

class Bid < ActiveRecord::Base
  belongs_to :post
  validates :price, presence: true
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :company_email, presence: true, 
                format: { with: VALID_EMAIL_REGEX}

end

只有在我的某个验证失败时才会收到以下错误。如果没有失败,则会正确保存出价:

Bids中的NoMethodError #create:undefined method`id&#39;为零:NilClass和

<%= f.hidden_field :post_id, :value => @post.id %> 

以红色突出显示。

出价控制器:

class BidsController < ApplicationController

def new
    @bid = Bid.new
    @post = Post.find(params[:id])
end

def show
    @bid = bids.find(params[:id])
end

def index
    @bid = bids.all
end

def create 
    @bid = Bid.new(bid_params)
    if @bid.save
        redirect_to root_path
        flash[:notice] = 'Bid received!'
    else
        render 'new'
    end
end

def bid_params
    params.require(:bid).permit(:price, :company_name, :company_street, :company_city,
                                :company_zip, :company_phone, :company_email, :post_id)
end

end

出价

<%= form_for(@bid) do |f| %>
 <%= render 'shared/error_messages' %>
  <div style='float: left; width: 50%;'>
   <div class="row">
    <div class="col-md-6 col-md-offset-3">

   <%= f.label "Price" %>
   <%= f.text_field :price, class: "form-control" %>

   <%= f.hidden_field :post_id, :value => @post.id %>

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

 <% end %>

2 个答案:

答案 0 :(得分:0)

验证失败时,params [:id]不会再次传递给新操作。你可以:

  • 使用params [:id]:

    提交另一个hidden_​​field
    <%= f.hidden_field :post_id, :value => params[:id] %>
    

然后在new操作中

def new
 @bid = Bid.new
 @post = Post.find(params[:id]) || Post.find(params[:post_id])
end
  • 如果验证失败,则在创建操作中使用id参数进行渲染:

    def create 
     @bid = Bid.new(bid_params)
     if @bid.save
      redirect_to root_path
      flash[:notice] = 'Bid received!'
     else
      render 'new', id: params[:id]
     end
    end
    

答案 1 :(得分:0)

查看您的创建操作: 验证失败后,它将执行以下操作:

    # on create action
    else
        render 'new'
    end

正确?这意味着它将呈现新动作的视图文件。但是你注意到在这个创建动作中没有这样的@post实例变量你加载Post吗? 这样的小技巧也是如此:

    else
        @post = Post.find(bid_params[:post_id])
        render 'new'
    end

现在,您已经在@post实例变量上加载了您的帖子记录。动作渲染:new表示您只是渲染该控制器的新动作方法的视图文件。

希望你明白我的意思!