【问题标题】:How do I get a url '/relationships/new?followed_id=bob' to instead read 'relationships/new/bob'?如何获取 url '/relationships/new?followed_id=bob' 来代替阅读 'relationships/new/bob'?
【发布时间】:2014-11-12 04:33:36
【问题描述】:

所以,我有一个搜索栏,所以用户(亚当)可以搜索另一个用户(鲍勃)

  • 搜索栏根据名称搜索用户。 (搜索 'bob' 返回 'bob')(这发生在 users/index.html.erb 上)
  • 一旦找到用户,他们的名字就会显示出来,并且搜索结果旁边会出现一个“添加关系”按钮。 (鲍勃“添加关系”)(再次在 users/index.html.erb 上弹出)
  • 我希望“添加关系”按钮链接到一个页面:“relationships/new/bob”(relationships/new/friendname)

  • 目前它链接到 /relationships/new?followed_id=bob

有什么想法可以让 '/relationships/new?followed_id=bob' 变成 'relationships/new/bob'?

**是否是发送不同的参数或变量以使搜索返回“bob”而不是“?followed_id=bob”的情况?

或者,是否可以将正在搜索的人的姓名参数与搜索结果一起发送,以便在按下时链接到“添加关系”按钮?

(其他相关信息,has_many 和 has_many through 关系都设置正确,所以用户 has_many 关系,to_params 也设置在 users 模型中,我不相信答案与这些方面有任何关系)

users_controller:

  def index
    @users = User.search(params[:search])
    @followed = User.find_by(name: params[:search])
    # @followed = User.find_by_name(params[:id])
  end

用户/index.html.erb:

<%= form_tag users_path, :method => 'get' do %>
    <p>
        <%= text_field_tag :search, params[:search] %>
        <%= submit_tag "Search", :name => nil %>
    </p>
<% end %>

<ul>
    <% @users.each do |user| %>
        <li>
            <%= user.name %>
            <%= link_to "Add Relationship", new_relationship_path(followed_id: @followed), class: "btn btn-primary" %>
            <%= @followed %>
        </li>
    <% end %>
</ul>

relationships_controller:

  def new
    if params[:followed_id]
      # @followed = User.find_by(name: params[:followed_id])
      # @followed = User.find(params[:followed_id])
      # @followed = User.find_by_name(params[:id])
      raise ActiveRecord::RecordNotFound if @followed.nil?
      @active_relationship = current_user.active_relationships.new(followed: @followed)
    else
      flash[:danger] = "Relationship required"
    end

  rescue ActiveRecord::RecordNotFound 
    render 'public/404', status: :not_found
  end

【问题讨论】:

    标签: ruby-on-rails variables routes url-routing params


    【解决方案1】:

    那么你需要一个收集路线来做到这一点(我在 3 个月前看到一个这样的答案,当我开始使用 rails 时),需要一点技巧:

    resources :users do
     collection do
       get :search, action: "search_user",  as: "search_user"
       get 'search/:followed_id', action: "search", as: "search"
     end
    end
    

    然后你可以在你的users_controller 中有一个名为search_user 的函数

    redirect_to search_users_path(params[:followed_id])

    这也可以通过 JavaScript 修改 window.href 来完成,但是有一个可用的 gem,叫做, js-routes,它可以帮助你,没有路由和控制器的麻烦。

    您似乎想使用用户名而不是唯一的名称,例如 id 或其他名称,但该方法存在缺陷,如果有多个同名用户怎么办。

    这是一个gist,您的代码通常应该是这样的。不过我没有测试。

    【讨论】:

    • 所以选项 1:设置收集路由或选项 2:使用 JavaScript 或选项 3:查看 js-routes?
    • 如果你问我关于优先级的问题,就个人而言“我过着宝石般的生活”,所以既然宝石经过测试,你可以选择宝石而不是直接使用 JS,是的,那些是 or's 。在你检查了 gem 之后,也许你可以决定使用哪一个。如果您不需要在其他地方修改路由,则可以使用路由。
    • 我认为我在其他地方不需要这个 - 也许是路由(选项 1?)选项?我不确定如何实现选项 1 - 我们可以聊天吗?
    • 这个 :P 有什么可以聊的,看看路由是否有效,然后去做。我写了代码。不过,如果您觉得需要帮助,请发起聊天。
    • 我不明白你的回答如何帮助我解决我遇到的问题,我希望能弄清楚这一切是如何运作的。 (以及如何开始聊天?)
    猜你喜欢
    • 2011-10-23
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多