Rails - 创建和更新操作不起作用
我是Rails的初学者,我有一个Suplement控制器,我无法创建或编辑一个suplement(删除工作正常)。我没有收到任何错误,只要点击并且控制台中的所有内容都可以正常工作,就没有任何反应。我尝试了我所知道的一切(这并不多),但我找不到这样的问题,类似的答案没有帮助。我会很感激任何帮助,谢谢!Rails - 创建和更新操作不起作用
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种形式。 您在_form.html.erb
文件中以及在new.html.erb
文件中有form_for @suplement
。尝试从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)删除form_for
并在new.html.erb内提交按钮 2)在_form.html.erb中添加了提交按钮,因此可以访问变量f
而且,因为你传递变量@suplement
局部局部变量suplement
,您可以使用变量suplement
_form.html.erb文件中没有@
标志
EDIT(关于评论):
您的用户出现验证错误,因为从Rails 5.0,belongs_to
关联会自动验证是否存在。
如果你不需要在你的suplement用户对象所有的时间,那么你应该贵会更改为belongs_to :user, optional: true
OR
,如果你确实需要的用户,而你总是希望它是当前用户登录,然后添加到您的_form
<%=f.hidden_field :user_id, current_user.id %>
这将使用设计的辅助方法来获得登录用户当前并将其分配给这个隐藏字段。不要忘记在你的控制器中添加这个参数suplement_params
控制器方法
这样做!但是现在,当我创建新项目时,虽然我已登录,但却出现“用户必须存在”错误。为什么会这样?更新是好的。我在观看一些例子时,在想想@suplement或者仅仅是_form中的suplement,现在我明白为什么两者都可以工作。谢谢! – nusound
@nusound很高兴帮助。请参阅我的回答的编辑版本的评论:) – Kkulikovskis
在您的控制器的#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
它已经用'before_action'完成了 – Kkulikovskis
当你说“没有任何反应,当我点击”你的意思是你甚至没有看到一个POST请求击中服务器? –
是的,绝对没有。 Kkulikovskis想通了,这是新的和_form中的双表单字段。 – nusound