在关联资源中使用/ form_for进行错误处理

时间:2011-03-14 16:28:52

标签: ruby-on-rails ruby error-handling

我似乎无法让流程在这里工作。我有一个Ruby on Rails(2.3.9)应用程序。出于这个问题的目的,我们只有几个资源。 BoxesMessages

Box has_many :messages
Message belongs_to :box

我创建了一个位于/boxes/1/new_message的视图,其中我有以下form_for代码。我可以从这个视图成功创建一条消息。当我的验证开始时,问题就出现了。

在这种情况下,message.body不能为空,并由message.rb验证。一旦此验证发生,它就会将用户踢到Message.new操作,并且在成功填写message.body后,应用程序将无法再找到要放置在@box.id中的message.box_id

我已经尝试了几乎所有我能想到的东西,不知道如何让用户接收验证并仍然成功地为盒子创建消息。请参阅下面的代码以供参考。

/views/boxes/new_message.html.erb

<% form_for [@box, Message.new] do |f| %>
  <%= f.error_messages %>

  <%= f.label :message_title %>
  <%= f.text_field (:title, :class => "textfield-message grid_12 alpha") %>

  <%= f.label :message_body %>
  <%= f.text_area (:body, :class => "textarea-message grid_12 alpha ") %>

  <%= f.submit "Add a Message", :class => 'input boxy' %>       
<% end %>

messages_controller.rb

  def create
    @message = Message.new(params[:message])

    @box = Box.find(params[:box_id])
    @message = @box.messages.build(params[:message])
    @message.user = current_user

    respond_to do |format|
      if @message.save
        flash[:notice] = 'Message was successfully created.'
        format.html {redirect_to @box }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @flash.errors, :status => :unprocessable_entity }
      end
    end
  end

  def new
    @message = Message.new

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @message }
    end
  end

1 个答案:

答案 0 :(得分:1)

我相信你的

@box = Box.find(params[:box_id])

应该是

@box = Box.find(params[:id])