【问题标题】:Rails Model Not Saving Correctly on Form SubmitRails 模型在提交表单时未正确保存
【发布时间】:2016-05-07 19:57:50
【问题描述】:

我的模型没有正确保存,在我编写的 before_save 验证之前也没有。

我的表格如下:

<%= form_for @troll, url: {action: 'create'} do |f| %>
    <%= f.label :email, 'Email (not stored)' %>
    <%= f.text_field :email, :required => true,  :prompt => 'Email Address' %><br/><br/>
    <%= f.label :apikey, 'API Key (not stored)' %>
    <%= f.text_field :apikey,:required => true, :prompt => 'API Key' %><br/><br/>
    <%= f.label :zone_id, 'Zone ID' %>
    <%= f.text_field :zone_id,:required => true,  :prompt => 'Zone Id' %></br><br/>
    <%= f.label :ip_addr, 'IPv4 Address' %>
    <%= f.text_field :ip_addr,:required => true, :prompt => 'IPv4 Address' %><br/><br/>
    <%= f.label :timeframe, 'Select a timeframe.' %>
    <%= f.select :timeframe, [["15 mins", 15],["60 mins", 60]] %><br/><br/>
    <%= f.submit troll_index_path, :value => "Commence Troll!" %>

<% end %>

#create 操作:

  def create
    puts params[:troll]
    @troll = Troll.new(troll_params)
    @troll.save

    puts @troll.inspect

    render '/troll/show', :troll => @troll
   end

再往下:

def troll_params
    params.require(:troll).permit(:email, :apikey, :zone_id, :ip_addr, :timeframe)
  end

我的“表演”动作和终端表演:

#<Troll id: nil, created_at: nil, updated_at: nil, ip_addr: "aaa", zone_id: nil, unix_timestamp: nil>

所以信息没有被保存或验证。我的模型如下:

class Troll < ActiveRecord::Base
    require 'resolv'

    attr_accessor :apikey, :email, :zone_id, :unix_timestamp, :time_interval, :timeframe

    validates :ip_addr, :format => {:with => Resolv::IPv4::Regex,:message => "Not an valid IPv4 format"}

    before_save :convert_to_unix

    def convert_to_unix(time_interval)
      timeValue = self.time_interval.to_i
      timeStamp = DateTime.now - timeValue/1440.0
      self.unix_timestamp = timeStamp.to_i 
    end

end

我的数据库架构非常简单。出于隐私原因,我只对保存几条数据感兴趣。

class CreateTrolls < ActiveRecord::Migration
  def change
    create_table :trolls do |t|

      t.string :ip_addr
      t.string :zone_id
      t.integer :unix_timestamp

    end
  end
end

我看到参数正确出现,但是当我保存到数据库时,它没有验证 ip_attr 或执行 unix 时间戳转换。

它也将 zone_id 显示为 nil,即使它就在参数中!非常感谢任何方向。

【问题讨论】:

  • 你的架构文件是什么样的?
  • 嘿@AndrewHendrie,我已经在上面添加了。干杯。
  • 你在你的巨魔控制器中使用了强参数吗?
  • 是的。我相信是这样。刚刚在上面添加了。
  • 另外,运行@troll.save!,看看返回了什么错误:stackoverflow.com/a/27421738/1945948

标签: ruby-on-rails ruby view model controller


【解决方案1】:

尝试将您的提交按钮更改为:

f.submit "Commence Troll" 

【讨论】:

  • 它做同样的事情。我在我的显示视图中将 zone_id 设为 nil,但参数仍显示 zone_id 的值。
  • 尝试删除模型中的 attr_accessor 行?
  • 这会爆炸,因为我需要访问 email,apikey 变量,但我不想存储它们。
  • 您是否在没有 resolv 和/或没有 convert_to_unix 方法的情况下对其进行了测试?
【解决方案2】:

你最好使用以下方法:

#app/views/trolls/new.html.erb
<%= form_for @troll do |f| %>

    <%= f.label :email, 'Email (not stored)' %>
    <%= f.text_field :email, :required => true,  :prompt => 'Email Address' %>

    <%= f.label :apikey, 'API Key (not stored)' %>
    <%= f.text_field :apikey, required: true, placeholder: 'API Key' %>

    <%= f.label :zone_id, 'Zone ID' %>
    <%= f.text_field :zone_id, required: true, placeholder: 'Zone Id' %>

    <%= f.label :ip_addr, 'IPv4 Address' %>
    <%= f.text_field :ip_addr, required: true, placeholder: 'IPv4 Address' %>

    <%= f.label :timeframe, 'Select a timeframe.' %>
    <%= f.select :timeframe, [["15 mins", 15],["60 mins", 60]] %><br/><br/>
    <%= f.submit "Commence Troll!" %>

<% end %>


#app/controllers/trolls_controller.rb
class TrollsController < ApplicationController
   def create
      @troll = Troll.new troll_params
      redirect_to @troll if @troll.save
   end

   private

   def troll_params
      params.require(:troll).permit(:email, :apikey, :zone_id, :ip_addr, :timeframe)
   end
end


#app/models/troll.rb
class Troll < ActiveRecord::Base
   require 'resolv'

   attr_accessor :apikey, :email, :time_interval, :timeframe
   validates :ip_addr, format: { with: Resolv::IPv4::Regex, message: "Not an valid IPv4 format"}

   before_save :convert_to_unix

   private

   def convert_to_unix(time_interval)
      timeValue           = self.time_interval.to_i
      timeStamp           = DateTime.now - timeValue/1440.0
      self.unix_timestamp = timeStamp.to_i 
   end
end

--

attr_accessor 声明中有 :zone_idunix_timestamp,这意味着它们不会被保存。

如果您运行上述代码,如果发生任何错误,它应该返回到您的trolls#new 操作,以便您解决它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 2017-06-14
    • 1970-01-01
    • 2019-08-31
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多