2016-08-20 147 views
0

我有一個Entry模型,其布爾列published,默認設置爲false。我寫在模型下面的方法:發佈方法無法正常工作

def self.publish 
    self.update(published: true) 
end 

,並在我的控制器我有

def publish 
    @entry = Entry.find(params[:id] 
    @entry.publish 
    redirect_to entries_path 
end 

(我想使它類似destroy方法的模型調用)。最後,我認爲我有這樣的:

<%= link_to "Publish", entries_path, method: :publish %> 

但是,當我點擊鏈接,該請求被create方法處理,並返回我下面的錯誤:

ActionController::ParameterMissing in Multiflora::EntriesController#create 
param is missing or the value is empty: entry 
+1

你在這裏做了很多錯誤的事情。您是否已將「發佈」添加到您的路線?請發佈您的'routes.rb'。 – dp7

+0

@dkp我看到..可能有另一種方法來設置布爾值爲真,而不重新發明輪子? @ _ @ – AlexNikolaev94

+1

首先,您需要了解'link_to'中傳遞的'method'是什麼。這是一個HTTP請求,也就是說它可以是'post'或'put'或'delete'或'get'(默認)。你已經分配了'method::publish'這是錯誤的,因爲你正在嘗試更新它應該是'method :: put'。其次,你的路線'entries_path'應該指向你的控制器的'publish'動作。而且,最後'publish'應該是模型中的**實例方法**。目前,它是一種類方法。 – dp7

回答

0

感謝所有的答案,我已經想通了什麼是我的失誤,但我花了一點思考,並決定讓它變得更加簡單:我只是添加了一個複選框來編輯表單,該表單設置了:published條目的屬性true。這裏是:

<%=form_for(@entry, as: :entry, url: content_entry_path(@entry)) do |f| %> 
    # ... 
    <p> 
    <%= f.label "Publish" %> <br /> 
    <%= f.hidden_field :published, value: '' %> 
    <%= f.check_box :published, checked: true %> 
    </p> 
<% end %> 

反正非常感謝您的答案!這是我缺乏知識,我會記得我做錯了什麼

+0

您可能想要刪除'hidden_​​field' –

1

第一件事情,也沒有HTTP方法稱爲:publish應該:put:patch

第二你需要傳遞id作爲參數

<%= link_to "Publish", publish_entry_path(@entry) %> 

你也將需要添加路線發佈操作

resources :events do 
    member do 
    put :publish 
    end 
end 

publish方法應該是實例方法

def publish 
    self.update(published: true) 
end 
+0

謝謝!但我想我已經想出了一個簡單的方法來管理它。我將在這裏發佈它作爲答案 – AlexNikolaev94

1

的方法是錯誤的link_to爲每API所以就不得不提到一個的有效Http方法(在您的情況下首選補丁),然後編輯您的route.rb文件以將此補丁請求傳輸到您指定的函數,如下所示:

patch'/entries/publish', to: 'entries#publish' 

然後將「entries_path」到「entry_path」

所以鏈接的代碼應該是這樣的:

<%= link_to "Publish", entry_path, method: :patch%>