【问题标题】:Rails 4 form not creating objectRails 4表单不创建对象
【发布时间】:2015-08-29 00:21:22
【问题描述】:

当我单击提交按钮时,我的 Rails 表单(控制器中的“新”操作)没有创建对象。我在页面或控制台中没有收到任何错误。似乎它被卡住了,并且没有对我的控制器中的“创建”操作执行 POST。当我单击表单上的提交按钮时,URL 会更改为 meds/new?utf8=✓&authenticity_token=<random characters> 并清除表单。

我觉得我错过了一些非常基本的东西(我已经有一段时间没有在 Rails 中编程了)。

以下是相关代码:

new.html.erb

<% if user_signed_in? && current_user.is_admin == true %>
                    <%= simple_form_for(@med) do |f| %>
                          <div class="form-group">
                                <%= f.label :brand_name, "Name of the medicine:" %>
                                <%= f.text_field :brand_name, required: true %>
                          </div>
                          <div class="form-group">
                          <%= f.label :generic_name %>
                          <%= f.text_field :generic_name, required: true %>
                          </div>
                          <div class="form-group">
                                <%= f.label :description %>
                                <%= f.input :description, as: :summernote, :id => 'description' %>
                          </div>
                          <div class="form-group">
                                <%= f.label :reactions %>
                                <%= f.text_area :reactions, class: 'summernote', id: 'reactions' %>
                          </div>
                          <div class="form-group">
                             <%= f.label :interactions %>
                                <%= f.text_area :interactions, class: 'summernote', id: 'interactions' %>
                          </div>
                          <div class="form-group">
                                <%= f.label :implementation %>
                                <%= f.text_area :implementation, class: 'summernote', id: 'implementation' %>
                          </div>
                          <div class="form-group">
                                <%= f.label :availability %>
                                <%= f.text_area :availability, class: 'summernote', id: 'availability' %>
                          </div>
                          <div class="form-group">
                                <%= f.label :warnings %>
                                <%= f.text_area :warnings, class: 'summernote', id: 'warnings' %>
                          </div>
                    <%= f.submit "Save changes", class: "btn btn-primary" %>
                     <% end %>
              <% end %>

meds_controller.rb

class MedsController < ApplicationController
  def index
  end

  def new
    @med = Med.new
  end

  def create
    @med = Med.create(med_params)
    redirect_to root_url
  end

  def show
    @med = Med.find(params[:id])
  end

  def edit
    @med = Med.find(params[:id])
  end

  def update
    @med = Med.find(params[:id])
        respond_to do |format|
            if @med.update(med_params)
                format.html { redirect_to @med, notice: 'Med was successfully updated.' }
                format.json { head :no_content }
            else
                format.html { render action: 'edit' }
                format.json { render json: @med.errors, status: :unprocessable_entity }
            end
        end
    end

  private

  def med_params
    params.require(:med).permit(:brand_name, :generic_name, :description, :reactions, :interactions, :implementation,
        :availability, :warnings)
  end

end

meds.rb 模型

class Med < ActiveRecord::Base
end

routes.rb

Rails.application.routes.draw do
  devise_for :users
  resources :meds
  #get 'meds/index'

  root to: "meds#index"
end

我错过了什么?

谢谢!!

编辑:单击按钮时在控制台中添加输出:

Started GET "/meds/new?utf8=%E2%9C%93&authenticity_token=XG44W3%2Bj5A3piAJnp0uQUF8L5gruoGDgdiaqZgCSf3bY219l%2BGIRc4Z%2FaypXa%2FacacQGTCFQmFMckS30Jf6ZLg%3D%3D&med%5Bbrand_name%5D=sfsdf&med%5Bgeneric_name%5D=sdfsdf&med%5Bdescription%5D=sdfsdf&med%5Breactions%5D=&med%5Binteractions%5D=&med%5Bimplementation%5D=&med%5Bavailability%5D=&med%5Bwarnings%5D=&commit=Save+changes" for ::1 at 2015-08-28 22:24:00 -0400
Processing by MedsController#new as HTML

编辑 2:我不认为 create 被调用。这是我的 rake 路线:

                  Prefix Verb   URI Pattern                    Controller#Action
        new_user_session GET    /users/sign_in(.:format)       devise/sessions#new
            user_session POST   /users/sign_in(.:format)       devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)      devise/sessions#destroy
           user_password POST   /users/password(.:format)      devise/passwords#create
       new_user_password GET    /users/password/new(.:format)  devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format) devise/passwords#edit
                         PATCH  /users/password(.:format)      devise/passwords#update
                         PUT    /users/password(.:format)      devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)        devise/registrations#cancel
       user_registration POST   /users(.:format)               devise/registrations#create
   new_user_registration GET    /users/sign_up(.:format)       devise/registrations#new
  edit_user_registration GET    /users/edit(.:format)          devise/registrations#edit
                         PATCH  /users(.:format)               devise/registrations#update
                         PUT    /users(.:format)               devise/registrations#update
                         DELETE /users(.:format)               devise/registrations#destroy
                    meds GET    /meds(.:format)                meds#index
                         POST   /meds(.:format)                meds#create
                 new_med GET    /meds/new(.:format)            meds#new
                edit_med GET    /meds/:id/edit(.:format)       meds#edit
                     med GET    /meds/:id(.:format)            meds#show
                         PATCH  /meds/:id(.:format)            meds#update
                         PUT    /meds/:id(.:format)            meds#update
                         DELETE /meds/:id(.:format)            meds#destroy
                    root GET    /                              meds#index

【问题讨论】:

  • 你能显示更多new.html.erb吗?我没有看到提交按钮。
  • 对不起!上面修复了
  • 尝试在MedsController#create操作中使用Med.create!(med_params)保存模型,并检查是否有任何验证错误。您也可以放置一个调试器并检查此对象的状态。
  • 感谢您的建议。只是试了一下,但我没有收到任何错误
  • 您确定正在调用创建操作吗?你在里面放了一个调试器然后它就停在那里了吗?

标签: ruby-on-rails forms ruby-on-rails-4


【解决方案1】:

在你的创建操作中试试这个:

def create
  @med = Med.create(med_params)

  if @med.save
    flash[:notice] = "Med was successfully created"
    redirect_to med_path(@med)
  else
    flash[:error] = "Med was not successfully created"
    render :new
  end
end

并将其添加到 index.html.erb 的第一行

<p id="notice">
  <%= notice %>
</p>

【讨论】:

  • 没用。该通知确实有效。它在我登录(使用设计)时显示,但在我单击提交按钮后没有显示错误。除了 URL 更改之外,什么都没有发生。
  • 是的,绝对不会影响您的创建操作。我打赌它与这个stackoverflow.com/questions/4104474/… 有关
  • 我会从该页面尝试@PaulAnnesley 的回答
  • 他说:Rails 4.2(可能更早)中的 form_tag 有一个 :enforce_utf8 选项;如果设置为 false,则不输出名为 utf8 的隐藏输入。他有链接
  • 再次感谢您的帮助。我在我的文本字段中添加了&lt;%= f.text_field :brand_name, required: true, :enforce_utf8 =&gt; false %&gt;,但我仍然遇到问题。我好难过。
【解决方案2】:

在你的 new.html.erb 中试试这个

&lt;%= simple_form_for @med, :url =&gt; { :action =&gt; "create" } do |f| %&gt;

【讨论】:

  • 感谢您的回复,但遗憾的是上面的代码并没有解决问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多