【问题标题】:How to route the same url to different actions?如何将相同的 url 路由到不同的操作?
【发布时间】:2013-05-04 02:40:27
【问题描述】:

我有一个通过控制器的索引操作呈现的页面。我想添加一个指向此页面的链接,这将重新加载当前页面,但我希望它首先路由到不同的操作。

这是我的 routes.rb 文件的样子:

match 'users/:id/food' => 'foods#index', :as => :foods_show
match 'users/:id/food' => 'foods#sell', :as => :food_sell

还有我的链接地址:

<%= link_to "Sell this Food", food_sell_path(current_user.id) %>

所以页面通常是通过 food#index 呈现的,但是当用户点击此链接时,我想重新加载当前页面,但通过与 index 不同的操作。

控制器代码:

def index
    @user = User.find(params[:id])
    @food = @user.foods
end

def sell
    @user = User.find(params[:id])
    @food = @user.foods
    redirect_to foods_show_path(@user.id), :notice => "You have sold one item!"
end

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:

    您不能将相同的 url 匹配到不同的操作,因为它们基本上是相同的。您需要更改 url 中的某些内容,或更改动词(get、post、put、delete)或添加一些参数来区分它们。

    例如,使用get 表示索引,使用post 表示卖出:

    get 'users/:id/food' => 'foods#index', :as => :foods_show
    post 'users/:id/food' => 'foods#sell', :as => :food_sell
    

    并在您的链接中将方法设置为post

    <%= link_to "Sell this Food", food_sell_path(current_user.id, :_method => 'post') %>
    

    【讨论】:

    • 假设我不希望任何一个 url 在 url 中发布参数。就像我不希望 GET 请求发布参数一样。解决这个问题的最佳方法是什么?
    • 对不起,我没听懂你的评论。在你不改变动词然后改变别的东西。
    • 另外,请注意,我不得不稍微修改您的代码:&lt;%= link_to "Sell this Food", food_sell_path(current_user.id), :method =&gt; 'post' %&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    相关资源
    最近更新 更多