Rails:链接到部分?

时间:2010-01-08 15:11:37

标签: ruby-on-rails ruby

目前我尝试做以下事情:

我为我的用户创建了几个部分(即_show_signature.html.erb)。 现在我想在点击链接时显示它们。 在我的用户控制器中,我创建了一个新操作:

  def show_signature
     @is_on_show_signature = true
  end

  def show_information
     @is_on_show_information = true
  end

在我的用户show.html.erb上编码:

<% if @is_on_show_information %>
    <%= render :partial => 'show_information' %>
<% elsif @is_on_show_signature %>
    <%= render :partial => 'show_signature' %>
<% end %>

并在我的“导航栏”中写道:

  <ul>
    <li class="profile-tab">
      <%= link_to 'Information', show_information_path %>
    </li>
    <li class="profile-tab">
      <%= link_to 'Signature', show_signature_path %>
    </li>
  </ul>

在我的routes.rb中我写道:

  map.show_information '/user-information', :controller => 'user', :action => 'show_information'
  map.show_signature '/user-signature', :controller => 'user', :action => 'show_signature'

现在我的问题:

点击我的“信息”链接会将我重定向到http://localhost:3000/user-information(因为我告诉他在routes.rb中这条路径 - 我想)并且我收到错误:

uninitialized constant UserController

但这不是我想要的......我的用户显示路径类似于:

http://localhost:3000/users/2-loginname

(通过编码

  def to_param
     "#{id}-#{login.downcase.gsub(/[^[:alnum:]]/,'-')}".gsub(/-{2,}/,'-')
  end

在我的用户模型中)

我想链接到像http://localhost:3000/users/2-test/user-information这样的想法。 任何想法如何工作?我有什么想法可以得到这个错误吗?

1 个答案:

答案 0 :(得分:6)

就Rails约定而言,模型本身是单数(User),但表(用户)和控制器(UsersController)都是复数。这可能会引起一定程度的混乱,甚至在使用Rails多年后,我仍然会尝试“user = Users.first”这样的错误,当然这是无效的,因为通常你会想到关于表名而不是类名。

此外,为了切换页面上元素的显示,您可能希望使用link_to_remote方法,该方法使用AJAX进行更新而不是页面刷新。如果您对整页刷新没有问题,那么这些操作将需要重定向到某些内容,例如页面引用者,否则您将获得空白页面或错误,因为页面模板不存在。

通常你做的是:

<ul>
  <li class="profile-tab">
    <%= link_to_remote 'Information', show_information_path %>
  </li>
  <li class="profile-tab">
    <%= link_to_remote 'Signature', show_signature_path %>
  </li>
</ul>

然后每个操作都是您指定的,但是,页面模板show_information.rjs看起来像:

page.replace_html('extra_information', :partial => 'show_information')

请记住,您需要一个占位符来接收部分内容,因此只需将可选部分包含在具有特定ID的元素中:

<div id="extra_information">
  <% if @is_on_show_information %>
    <%= render :partial => 'show_information' %>
  <% elsif @is_on_show_signature %>
    <%= render :partial => 'show_signature' %>
  <% end %>
</div>