Rails - 修改/复制默认“show”

时间:2013-03-05 06:36:23

标签: ruby-on-rails routes

无论如何我可以修改默认“show”的行为吗?

目前用户点击主网站上的按钮

<%= link_to "ADD TO CART", product, {:class => "btn btn-primary", :target => '_blank', :method => "get"} %>

用户将自动重定向到包含相应信息的页面。

现在我正在尝试创建一个稍微不同的页面(移动设备友好),并且我创建了一个mobile_show页面,如果我直接访问它,它就能正常工作。

我的问题是我应该如何修改link_to,使其指向/mobile/products/id而不是当前products/id

更新(额外信息):

在products_controller.rb`

  # GET /mobile
  # GET /mobile.json
  def mobile
    @products = Product.current

    respond_to do |format|
      format.html # mobile.html.erb
      #format.json { render json: @products }
    end
  end`

  # GET /mobile/products/1
  # GET /mobile/products/1.json
  def mobile_show
    @product = Product.find(params[:id])
    @product.update_attribute(:is_active, false)

    respond_to do |format|
      format.html # mobile_show.html.erb
      #format.json { render json: @product }
    end
  end

在routes.rb

  match '/mobile' => 'products#mobile'
  match '/cashback' => 'products#cashback'
  match '/mobile/products/:id' => 'products#mobile_show'

p / s:我对一般的rails和web开发非常陌生

2 个答案:

答案 0 :(得分:0)

根据您现有的路线,您可以将路线更改为

match '/mobile/products/:id' => 'products#mobile_show', as: :mobile_product

然后在你看来

<%= link_to "ADD TO CART", mobile_product_path(product), {:class => "btn btn-primary", :target => '_blank', :method => "get"} %>

更新:这是好的做法吗?

这实际上取决于你想要达到的目标。如果您想为您的应用创建移动版本,我建议您查看响应式ui。如果这是不可能的,处理此问题的正确方法是创建一组不同的控制器来处理移动请求。 这些控制器应放在不同的命名空间下。

namespace :mobile do
  resources :products
end

这可能会让您拥有app/controllers/mobile/products_controller.rb并在此处理移动请求。

答案 1 :(得分:0)

您实际上应该专门为移动设备创建命名空间或控制器,这样它就不会破坏REST 例如

应用程序/控制器/移动/ products_controller.rb

应用程序/控制器/ mobile_products_controller.rb

但是要使用您的方法,您可能需要为路线添加名称以便使用它

match '/mobile' => 'products#mobile', :as => "mobile"

然后改变你的

<%= link_to "ADD TO CART", mobile_path, {:class => "btn btn-primary", :target => '_blank', :method => "get"} %>