【问题标题】:Rails form_for model in different controllerRails form_for模型在不同的控制器
【发布时间】:2010-09-12 04:36:43
【问题描述】:

我有以下模型类:

class Upload < ActiveRecord::Base
   ...
   has_many   :reviews, :order => "created_at DESC"
   ...
end

class Review < ActiveRecord::Base
  ...
  belongs_to :upload
  belongs_to :user
  validates_presence_of :description
  ...
end

我的上传/显示视图有一个表格,用于捕获特定上传的评论:

<% form_for(@review) do |f| %>
  <%= f.error_messages %>
  ...
  <p>
    <%= f.text_area :description, :rows => 5, :cols => 80 %>
  </p>
  ...
  <p>
    <%= f.submit 'Submit Review' %>
  </p>
<% end %>

当评论验证失败时,如何在上传/显示视图的评论表单中显示错误消息?

我的 ReviewController 会这样做:

定义创建 @review = current_user.reviews.new(params[:review])

 if @review.save
   flash[:notice] = 'Review was successfully created.'
   redirect_to( @review.upload )
 else
   render :action => :new
 end

结束

显然render :action =&gt; :new 不起作用,因为我需要显示 UploadsController 的显示操作,而不是 ReviewController 的新操作。

我很确定有一个简单的方法可以做到这一点,我就是想不通!

【问题讨论】:

    标签: ruby-on-rails forms


    【解决方案1】:

    您的评论控制器操作应该接收params['upload_id'] 以将评论与其上传相关联,或者通过 URL(如果评论是像 POST /uploads/1/reviews 这样的嵌套路由),或者来自隐藏字段。

    您可以使用render :template 进行重定向:

    def create
      @review = current_user.reviews.new(params[:review])
      @upload = Upload.find(params['upload_id'])
      @review.upload = @upload
      if @review.save
        flash[:notice] = 'Review was successfully created.'
        redirect_to( @upload )
      else
        flash[:error] = 'Review could not be created.'
        render :template => 'uploads/show'
      end
    end
    

    也可以只呈现表单以供审核(即默认的“reviews/new”),直到表单输入正确,而不是显示整个页面以供上传。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      相关资源
      最近更新 更多