2016-08-20 153 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%>