Iam有点坚持这个问题。尝试从管理视图更新作业模型中的非质量可分配属性。我需要一个触发管理控制器中的动作方法的按钮,它只是将作业的isactive值更改为true。
在管理员控制器中:
def approve
@job.update_attribute(:isactive = true)
if @job.save
redirect_to(:action => :show)
flash[:notice] = "Job Approved"
else
render 'show'
end
end
在jobs / 1视图中
<div style="text-align:center;" class="widget">
<%= form_for(@job, :url => url_for(:controller => 'admin', :action => 'approve'), :html => {:id => "contact_form", :class => "g-form"}) do |f| %>
<%= button_tag( :class => "g-btn type_default") do %>
<i class="icon-share-alt icon-white"></i>Approve this job
<% end %>
<% end %>
<% end %>
无论我做什么,此表单都会提交到作业更新操作并显示作业已成功更新,而不是来自管理员批准操作中的“已批准作业”通知。
我也添加了以下路线。但不确定我做错了什么。我需要一个简单的按钮(理想情况下是一个块,因为样式请求),它将作业的isactive字段设置为true。
match "jobs/:id", :via=>:post, :controller=>"admin", :action=>"approve"
答案 0 :(得分:0)
群发作业旨在准确保护您在此处尝试的内容,理想情况下,如果您需要修改白名单,请将其添加到白名单(attr_accessible
)。
但是,即使您将isactive
属性列入白名单,也需要解决控制器操作的一些问题。
@job.update_attribute(:isactive = true)
无效。 update_attribute
无法处理分配,正确的语法为update_attribute(attribute, value)
,因此应该是:
@job.update_attribute(:isactive, true)
此外,update_attribute
方法调用保存传递的对象。在@job.save
之后调用update_attribute
(假设没有其他代码分配属性)是多余的。
编写此方法的更好方法是:
def approve
if @job.update_attribute(:isactive, true)
redirect_to(:action => :show)
flash[:notice] = "Job Approved"
else
render 'show'
end
end
但是,如果您无法修改模型并且不担心回调或验证,则可以使用update_column
(或Rails 4中的update_columns
)直接更新数据库列:
def approve
if @job.update_column(:isactive, true)
redirect_to(:action => :show)
flash[:notice] = "Job Approved"
else
render 'show'
end
end