路由和嵌套资源

时间:2010-11-12 03:45:43

标签: ruby-on-rails routing

我有一组嵌套资源 - :users和:messages。

  resources :users, :only => [:show,:index] do
    resources :messages
  end

还有Message模型的“new.html.haml”模板中的formtastic表单,它需要使用这些资源:

=semantic_form_for [@user,@message] do |f|
 =f.input :title

问题在于[@ user,@ message]生成的实际操作路径,它看起来像这样:

/users/4cdc7f9dfae434029a0000aa/messages

这是错误的,因为我使用的是命名路由,所以这应该看起来像“/ users / nickname / messages”

如何确保@user生成正确的路径输出?

编辑:这是我用来强制用户的名称路线。

  match "/users/:nickname/messages" => "messages#index"
  match "/users/:nickname/messages/new" => "messages#new", :as=>:new_message
  match "/users/:nickname/messages" => "messages#create", :as=>:create_message

2 个答案:

答案 0 :(得分:4)

我想你想要的是使用昵称作为url slug。您需要的只是常规嵌套资源;

# in routes.rb

resources :users do
  resources :messages
end

会给你相同的路线,除非他们在那里有:id而不是:nickname

现在让您使用用户的昵称作为网址标识符的实际技巧:

# user.rb

class User < ActiveRecord::Base
  def to_param
    self.nickname
  end
end

您会自动在网址中获取昵称,并将其作为params[:id]传递给控制器​​,因此您必须在控制器中采取相应措施

# users_controller.rb
…
def show
  @user = User.find_by_nickname(params[:id])
end
…

答案 1 :(得分:0)

这应该可以解决问题

=semantic_form_for :message, :url => create_message_path(:nickname => @user.nickname) do |f|
  # ...
相关问题