2017-10-11 68 views
1

我是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 
+0

当你说“没有任何反应,当我点击”你的意思是你甚至没有看到一个POST请求击中服务器? –

+0

是的,绝对没有。 Kkulikovskis想通了,这是新的和_form中的双表单字段。 – nusound

回答

2

它看起来像问题是,你有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控制器方法

+0

这样做!但是现在,当我创建新项目时,虽然我已登录,但却出现“用户必须存在”错误。为什么会这样?更新是好的。我在观看一些例子时,在想想@suplement或者仅仅是_form中的suplement,现在我明白为什么两者都可以工作。谢谢! – nusound

+0

@nusound很高兴帮助。请参阅我的回答的编辑版本的评论:) – Kkulikovskis

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 
+0

它已经用'before_action'完成了 – Kkulikovskis