2017-10-11 63 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