Rails - 创建和更新操作不起作用

时间:2017-10-11 12:44:42

标签: ruby-on-rails ruby-on-rails-5

我是Rails的初学者,我有一个Suplement控制器,我无法创建或编辑一个补充(删除工作正常)。我没有收到任何错误,当我点击并且控制台上的一切工作正常时,没有任何反应。我尝试了所有我知道的东西(这并不多),我也找不到这样的问题,类似的答案并没有帮助。我很感激任何帮助,谢谢!

class SuplementsController < ApplicationController
  before_action :set_suplement, only: [:show, :edit, :update, :destroy]
  before_action :authenticate_user!
  def index
   @suplement = Suplement.all.order("created_at DESC")
  end

  def new
    @suplement = Suplement.new
  end

  def create
    @suplement = Suplement.new(suplement_params)
  if @suplement.save
    redirect_to '/suplements'
  else
    render '/suplements/new'
  end
end

def show
end

def edit
end

def update
  if @suplement.update(suplement_params)
    redirect_to '/suplements'
  else
    redirect_to '/suplements/new'
  end
end

def destroy
  @suplement.destroy
    redirect_to '/suplements'
end

private

  def set_suplement
    @suplement = Suplement.find(params[:id])
  end

  def suplement_params
    params.require(:suplement).permit(:name,
                                      :number_of_units,
                                      :daily_dosage_in_units,
                                      :number_of_days,
                                      :suplement_cost
                                      )
  end
end

以下是一个观点:

<h1>Create new suplement</h1>

  <%= form_for(@suplement) do |f| %>

  <%= render 'form', suplement: @suplement %>

  <div class="actions">
    <%= f.submit %>
  </div>

<% end %>

这是一个部分形式:

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

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

    <div class="field">
      <%= f.label :name %>
      <%= f.text_field :name %>
    </div>

    <div class="field">
      <%= f.label :number_of_units %>
      <%= f.text_field :number_of_units %>
    </div>

    <div class="field">
      <%= f.label :daily_dosage_in_units %>
      <%= f.text_area :daily_dosage_in_units %>
    </div>

    <div class="field">
      <%= f.label :number_of_days %>
      <%= f.text_area :number_of_days %>
    </div>

    <div class="field">
      <%= f.label :suplement_cost %>
      <%= f.text_area :suplement_cost %>
    </div>

  <% end %>

我的模特:

class Suplement < ApplicationRecord
  belongs_to :user
  validates :name,
            :number_of_units,
            :daily_dosage_in_units,
            :number_of_days,
            :suplement_cost,
            presence: true
end

 class User < ApplicationRecord

   devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

   has_many :suplements
 end

2 个答案:

答案 0 :(得分:2)

看起来问题是你有2个表格。 您的form_for @suplement文件以及_form.html.erb文件中都有new.html.erb。尝试将其从new.html.erb中移除,以便您的文件看起来像这样

new.html.erb

<h1>Create new suplement</h1>
<%= render 'form', suplement: @suplement %>

_form.html.erb

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

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

    <div class="field">
      <%= f.label :name %>
      <%= f.text_field :name %>
    </div>

    <div class="field">
      <%= f.label :number_of_units %>
      <%= f.text_field :number_of_units %>
    </div>

    <div class="field">
      <%= f.label :daily_dosage_in_units %>
      <%= f.text_area :daily_dosage_in_units %>
    </div>

    <div class="field">
      <%= f.label :number_of_days %>
      <%= f.text_area :number_of_days %>
    </div>

    <div class="field">
      <%= f.label :suplement_cost %>
      <%= f.text_area :suplement_cost %>
    </div>
    <div class="actions">
      <%= f.submit %>
    </div>
  <% end %>

我做的是:

1)在new.html.erb中删除了form_for并提交了按钮 2)在_form.html.erb中添加了提交按钮,因此可以访问变量f

此外,由于您将变量@suplement传递给部分局部变量suplement,因此您可以在_form.html.erb文件中使用变量suplement而不使用@登录

编辑(关于评论):

您获取用户状态验证错误,因为从Rails 5.0开始,belongs_to关联会自动验证是否存在。

如果您的续处对象中不需要用户,则应将关联更改为belongs_to :user, optional: true

OR

如果您确实需要该用户,并且您始终希望它是当前登录的用户,请将其添加到您的_form

<%=f.hidden_field :user_id, current_user.id %>

这将使用Devise helper方法获取当前登录用户并将其分配给此隐藏字段。不要忘记在控制器suplement_params控制器方法

中添加此参数

答案 1 :(得分:1)

在控制器的#edit中,您需要设置@suplement变量的值。

def edit
  @suplement = Suplement.find(params[:id])
end

您还应该将上述行添加为#update方法

中的第一行
def update
  @suplement = Suplement.find(params[:id])
  if @suplement.update_attributes(suplement_params)
    # continued...
end