2010-11-12 162 views
1

我有一组嵌套的资源 - :用户和:消息。路由和嵌套资源

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

而且也为消息模式“new.html.haml”模板formtastic形式,它需要使用这些资源:

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

的问题是,在实际操作路径从[@用户,@消息]生成的,它看起来像这样:

/users/4cdc7f9dfae434029a0000aa/messages 

这是错误的,因为我使用了一个名为路线,所以这应该看起来像“/用户/昵称/邮件”

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

编辑:这是我使用slugify用户的路线名称。

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

回答

4

我想你想要的是使用昵称作为URL蛞蝓。你需要的只是常规的嵌套资源;

# in routes.rb 

resources :users do 
    resources :messages 
end 

这将使你同样的路线,除了他们将有:id而不是:nickname在那里。

现在的实际技巧,让您使用用户的昵称作为URL标识:

# user.rb 

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

你会自动获得在URL中的昵称,并把它传递给你的控制器为params[:id],所以你必须在您的控制器中采取相应措施

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

这应该做的伎俩

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