【问题标题】:How save input from static page to database in rails如何将静态页面的输入保存到rails中的数据库
【发布时间】:2013-09-08 21:29:31
【问题描述】:

我想将静态页面中的输入“电子邮件”保存到数据库中。现在,我有一个带有 :address 字段的电子邮件模型,但是单击提交输入时我无法保存该值。

表单布局

# layout/website.html.erb
<div>
  <%= form_for @email, :url => newsletter_path, :method => :post do |email| %>
    <%= email.text_field :address %>
    <%= email.submit "Go" %>
  <% end %>
</div>

页面控制器

# controllers/pages_controller.rb
def home
  newsletter
end

def newsletter
  @email = Email.new(params[:address])

  if @email.valid?
    redirect_to(request.referer, :notice => "The suscription has been sent successfully.")
  else
    redirect_to(request.referer, :alert => "Please add an valid email address.")
  end
end

路线

# routes.rb from static pages
  get "/home" => 'pages#home', :as => :home
  get "/pricing" => 'pages#pricing', :as => :pricing
  get "/logo-gallery" => 'pages#logo_gallery', :as => :logo_gallery
  get "/blog" => 'pages#blog', :as => :blog
  get "/blog/:id" => 'pages#post', :as => :post
  get "/contact" => 'pages#contact', :as => :contact
  match '/contact' => 'pages#create', :as => :contact, :via => :post
  get "/faqs-and-terms" => 'pages#faqs_and_terms', :as => :faqs_and_terms

  match "/newsletter" => 'pages#newsletter', :as => :newsletter, :via => :post

型号

# models/email.rb 
class Email < ActiveRecord::Base
  attr_accessible :address
  validates :address, :format => { :with => %r{.+@.+\..+} }, :allow_blank => true
end

使用此代码,当我现在访问 /home 时收到:

ActionController::ActionControllerError in PagesController#home
Cannot redirect to nil!

我希望你能帮助我,我能做些什么来解决这个问题并获得更好的代码。谢谢。

【问题讨论】:

  • 你可以试试redirect_to :back
  • 表示你想在数据库中保存价值还是想重定向?
  • @harsh4u 将值保存在数据库中,然后重定向到与通知相同的页面,或者如果无效,则与警报。
  • @hedgesky 如果我使用 :back 我收到了消息...在此操作的请求中未设置 HTTP_REFERER,因此无法成功调用 redirect_to :back。如果这是一个测试,请确保指定 request.env["HTTP_REFERER"]。

标签: ruby-on-rails forms routes


【解决方案1】:

在时事通讯操作中,电子邮件记录仅被初始化但不被保存。而且您无需每次都在 home 操作中调用 newsletter 方法。只需像这样更新您的代码。

页面控制器

# controllers/pages_controller.rb
.....
# no need to call newsletter action here
def home      
end

def newsletter
  @email = Email.new(params[:email])

  if @email.save
    redirect_to((request.referer || '/'), :notice => "The suscription has been sent successfully.")
  else
    redirect_to((request.referer || '/'), :alert => "Please add an valid email address.")
  end
end

表单布局

由于@email没有在控制器中定义,所以你应该在表单中初始化一个Email对象。

# layout/website.html.erb
<div>
  <%= form_for Email.new, :url => newsletter_path, :method => :post do |email| %>
    <%= email.text_field :address %>
    <%= email.submit "Go" %>
  <% end %>
</div>

我希望它应该工作。

【讨论】:

  • 这个生成:在 Thu Sep 05 00:32:46 -0700 2013 开始 GET "/home" for 127.0.0.1 由 PagesController#home 处理为 HTML (0.1ms) 开始事务 SQL (0.4ms ) INSERT INTO "emails" ("address", "created_at", "updated_at") VALUES (?, ?, ?) [["address", nil], ["created_at", Thu, 05 Sep 2013 07:32: 46 UTC +00:00], ["updated_at", Thu, 05 Sep 2013 07:32:46 UTC +00:00]] (20.1ms) 提交事务重定向到localhost:3000/home Completed 302 发现在 23ms (ActiveRecord: 20.6毫秒)
  • 那么这是否解决了您的问题,您希望在将电子邮件记录保存到数据库后将请求重定向到哪里?
  • 我认为我的问题是当我尝试加载 /home 表单尝试将输入发送到数据库时,结果为零。
  • 为什么你在 home action 中调用 newsletter 方法?只需删除它,然后重试。
  • 如果我这样做,hace 与这个 :url => newsletter_path 冲突,错误:NilClass:Class 的未定义方法 `model_name'
【解决方案2】:

您应该使用Email.create(params[:email]) 而不是Email.new(params[:address]) 将记录保存在数据库中。此外,在您看来,您的代码添加 hidden_​​field

<%= email.text_field :address %>
<%= hidden_field_tag :referer, :value => request.path %>
<%= email.submit "Go" %>

然后在控制器中:

redirect_to params[:referer]

UPD 另外,请注意您应该在控制器中使用params[:email],而不是params[:address]。您可以在控制器中调用 raise params.inspect 来检查表单发送的参数。

【讨论】:

  • 我改变了,但仍然无法重定向到零!
  • 谢谢你,我做了你提到的改变,但仍然无法重定向到零!
  • 我认为错误是当我尝试加载 /home 时,自动尝试创建电子邮件 Started GET "/home" for 127.0.0.1 at Thu Sep 05 00:35:19 -0700 2013 Processing通过 PagesController#home 作为 HTML (0.1ms) 开始事务 SQL (0.4ms) INSERT INTO "emails" ("address", "created_at", "updated_at") VALUES (?, ?, ?) [["address", nil ], ["created_at", 2013 年 9 月 5 日星期四 07:35:19 UTC +00:00], ["updated_at", 2013 年 9 月 5 日星期四 07:35:19 UTC +00:00]] (0.9ms) commit transaction (0.0ms) begin transaction (0.0ms) commit transaction Redirected to Completed 500 Internal Server Error in 5ms
  • 出现此错误是因为您在 home 操作中调用了 newsletter 方法。您应该删除该行。
猜你喜欢
  • 2016-04-12
  • 2014-08-20
  • 1970-01-01
  • 2018-03-21
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多