2017-09-14 18 views
1

我试图保存数据,但在提交数据时,它只是刷新页面,但实际上并未将数据存储在表中。甚至也不会给出任何错误。我想要做的是保存数据后,控制应该在空白文本框的同一页面上。数据未保存在Rails应用程序中

使用Ruby 2.4.1,Rails的5.1.3,SQLITE3

这是feedback_controller.rb

class FeedbackController < ApplicationController 
    def new 
    @feedback = Feedback.new 
    end 

    def create 
    @feedback = Feedback.new(feedback_params) 
    redirect_to root_path 

    respond_to do |f| 
     if @feedback.save 
     f.html {redirect_to @feedback, notice: 'feedback submitted'} 
     f.json {render :new, status: :created, location: :@feedback} 
    else 
     f.html {render :new } 
     f.json {render json: @feedback.errors, status: :unprocessable_entity} 
    end 
    end 
    end 

    private 

    # def set_feedback 
    # @feedback = Feedback.find(params[:id]) 
    # end 

    def feedback_params 
    params.require(:feedback).permit(:name, :email, :message) 
    end 
    end 

的内容这里是new.html.erb文件。

<%= form_with scope: :feedback, url: feedback_new_path, local: true do |form| %> 

<% if @feedback.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(feedback.errors.count, "error") %> prohibited this feedback from being saved:</h2> 

     <ul> 
     <% @feedback.errors.full_messages.each do |message| %> 
      <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= form.label :name %> 
    <%= form.text_field :name, id: :feedback_name %> 
    </div> 

    <div class="field"> 
    <%= form.label :email %> 
    <%= form.text_field :email, id: :feedback_email %> 
    </div> 

    <div class="field"> 
    <%= form.label :message %> 
    <%= form.text_area :message, id: :feedback_message %> 
    </div> 

    <div class="actions"> 
    <%= form.submit "Submit Feedback"%> 
    </div> 
<% end %> 

<%= link_to 'Home', root_path %> 

这是彪马服务器上的日志中说,同时存储数据:

Started POST "/feedback/new" for 127.0.0.1 at 2017-09-14 21:33:41 +0530 
Processing by FeedbackController#new as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"Dk1sGiKYryIOeU6HyO7zeX6wqXazj9BUfooJgIDH1JjHxuKwA5MT0E6zvuwFYXGA8xEOz+tGAiXWySKv7voKvg==", "feedback"=>{"name"=>"sheshang", "email"=>"[email protected]", "message"=>"this is demo message"}, "commit"=>"Submit Feedback"} 
    Rendering feedback/new.html.erb within layouts/application 
    Rendered feedback/new.html.erb within layouts/application (3.8ms) 
Completed 200 OK in 75ms (Views: 55.2ms | ActiveRecord: 1.3ms) 

除了这个问题,我想知道如何调试Rails应用程序。就像在C或其他程序中一样,我们用printf语句来检查控件是否进入内部。我们如何在Rails中做到这一点?

回答

0

正如你所看到的,你发布到new行动:

Started POST "/feedback/new" for 127.0.0.1 at 2017-09-14 21:33:41 +0530 
Processing by FeedbackController#new as HTML 

但是,new动作没有做保存。

所以,你可能想:

<%= form_with scope: :feedback, url: feedbacks_path, local: true do |form| %> 

按照惯例,如果你这样做(在你的routes.rb文件):

resources :feedbacks 

那么你应该得到:

feedbacks GET  /feedbacks(.:format)    feedbacks#index 
       POST  /feedbacks(.:format)    feedbacks#create 
new_feedback GET  /feedbacks/new(.:format)   feedbacks#new 
edit_feedback GET  /feedbacks/:id/edit(.:format)  feedbacks#edit 
    feedback GET  /feedbacks/:id(.:format)   feedbacks#show 
       PATCH  /feedbacks/:id(.:format)   feedbacks#update 
       PUT  /feedbacks/:id(.:format)   feedbacks#update 
       DELETE  /feedbacks/:id(.:format)   feedbacks#destroy 

由于你可以看到,这不会为生成POST动词0行动,这表明你不使用传统路线。如果这是真的,那么你可能需要更新你的路线,以便得到feedbacks_path

我推荐以下约定,因为它通常会使生活更轻松。

至于打印到控制台,我倾向于做:

puts "#{self.class}.#{__method__}, var: #{var}" 

我更换var与任何变量我要检查。我喜欢包括#{self.class}.#{__method__}位,因为它让我知道我在哪种课程和方法。

+0

我是该技术的新学员。所以我不知道我应该得到什么,反馈或反馈。假设我添加了资源:在我的routes.rb中反馈。那又怎么样? – Sheshang

+0

你是否按照我的建议更新了你的'form_with'?有什么结果? – jvillian

+1

是的,我确实更新过。并且我得到了一些我认为可以解决的依赖性错误。让我这样做。我会稍后让你知道 – Sheshang

相关问题