使用嵌套路由进行渲染时出错

时间:2011-04-15 04:16:50

标签: ruby-on-rails validation routing actioncontroller nested-routes

我正在尝试在验证失败的用户消息传递时维护一个漂亮的URL。

我有一个类似于以下内容的路由文件:

  # For logged users convenience
  #             example.com/messages
  # instead of: example.com/users/:user_id/messages
  map.resources :messages

  # For everyone else
  map.resources :users do |p|
    p.resources :messages
  end

所以 new_user_message_path(@user)返回:

/users/:user_id/messages/new

消息的new.erb视图生成正确的代码:

<form action="/users/:user_id/messages" .........

验证失败时会显示表单错误,但会执行错误的操作:

<form action="/messages" .........

因此,用户第二次提交表单时,“创建”方法无法找到 user_id

以下是我的控制器方法:

  def new
    @user = User.find(params[:user_id])
    @message = @user.messages.build
  end

  def create
    @user = User.find(params[:user_id])
    @message = @user.messages.new(params[:message])

    if @message.save
      flash[:notice] = 'Message saved'
      redirect_to user_url(@user)
    else
      render :action => "new" # Here is the problem I guess
    end
  end

我的表单视图:

<% form_for [@user, @message] do |f| %>
  <%= f.error_messages %>    
    Name:<%= f.text_field :name %>
    Email:<%= f.text_field :email %>
    Message:<%= f.text_area :body, :rows => 3 %>
    <%= f.submit 'Send' %>   
<% end %>

1 个答案:

答案 0 :(得分:4)

尝试

<% form_for [:user, @message] do |f| %>