在Rails 3.2应用程序中,我对附件类型进行了验证。
附件模型:
class Attachment < ActiveRecord::Base
validates_presence_of :name
validates_attachment_presence :attach, :message => "No file selected"
validate :check_type
def check_type
if self.costproject_id != nil
if self.attach_content_type != 'application/pdf'
self.errors.add(:pdf, " ONLY")
return false
end
end
end
但是,return false
将我发送到此网址:
http://localhost:3000/attachments
我希望它返回上一个输入屏幕:
http://localhost:3000/attachments/new?costproject_id=2
我如何做到这一点?
谢谢!
UPDATE1
重定向可能必须在控制器中进行?
format.html { render action: "new" }
附件控制器:
# POST /attachments
# POST /attachments.json
def create
@attachment = Attachment.new(params[:attachment])
respond_to do |format|
if @attachment.save
format.html { redirect_to session.delete(:return_to), notice: 'Attachment was successfully created.' }
format.json { render json: @attachment, status: :created, location: @attachment }
else
format.html { render action: "new" }
format.json { render json: @attachment.errors, status: :unprocessable_entity }
end
end
end
我更改了这一行:
format.html { render action: "new" }
要:
format.html { redirect_to request.referer }
现在它又回到了我想要的地方。但是,我已经失去了错误 - 他们不会显示。
答案 0 :(得分:0)
试试这个。
替换
return false
使用
redirect_to request.referrer || root_url
注意:root_url这里是一个catchall。这也是Rails 4,我不知道它是否也适用于Rails 3.不过值得一试。
调试提示
首先确认一个简单的redirect_to root_url(或您用于root的名称)在您的控制器中工作
redirect_to root_url
然后,一旦redirect_to确认工作,请专注于获取REST接口“请求”。信息。这里有一个Rails 3讨论可能会对你有所帮助。
答案 1 :(得分:0)
帮助您了解此处发生的事情。当你转到/ attachments / new时,你正在渲染一个表单。当您按提交时,您正在向/ attachments发送POST请求,该请求会调用create
操作。
你创造的动作似乎是坚实而又自然的。但是,当您render action: "new"
出现错误时,它不是完整重定向,而是在当前操作的上下文中呈现表单。
通常情况下这很好,因为idomatic rails会让你在new和create中构建一个非常相似的模型对象,而helper的表单会渲染该对象。但是,您的新操作是基于大量的查询参数创建各种对象,我猜测这就是您看到不喜欢的行为的原因。
我希望您的最终解决方案将涉及以某种方式将所有这些参数添加到附件中,如果他们不需要保存到数据库,您可以在附件上创建attr_accessors
# Model
class Attachment < ActiveRecord::Base
attr_accessor :worequest_id, :workorder_id # etc
end
# View
<%= form_for @attachment do |f| %>
<%= f.hidden :worequest_id %>
<% end %>
以这种方式接近它,你的帖子请求参数将看起来像
{
attachment:
{
worequest_id: 1,
# etc
}
}
并且您还需要重新设计查询参数以将个体ID嵌套在附件中
/attachments/new?[attachment][worequest_id]=1
这样你就可以在两个动作中用params建立附件:
Attachment.new(params[:attachment])
现在你当前的创建动作应该或多或少地按预期工作,因为它现在是它的惯性轨道。
您仍然无法使用相同的查询参数获取新操作,但由于您正在使用这些参数并将其填充到表单上的隐藏字段中,因此当您尝试时它们不会丢失并且无法创造。在任何情况下,除非你做一些事情来保持请求之间的值,POST到/ attachments将消除ery params。