Ruby on Rails:URL参数

时间:2014-08-12 05:38:37

标签: ruby-on-rails ruby url-parameters

我有一个观点

#myView.html.erb
<% @data = MyModel.where(mymodel_id: '1').take %>
<%= link_to 'myController', myController_path(:myView_data => @data)%>

MyModel.rb包含 列ID 列名称

在我的控制器中我有

#MyController.rb
flag = params[:myView_data] #flag now is equal to the id of @data

这一切都很好,但我的问题是旗帜现在有 id的params [:myView_data] ,而我真正想要的是那个旗帜将有 名称不是ID

这是我想要发生的事情的样本

#MyController.rb
flag = params[:myView_data].name #flag must contain the name not the id

如果有可能,请帮助:)谢谢

3 个答案:

答案 0 :(得分:2)

当您将记录传递到 link_to 方法时,Rails会默认将此参数转换为 id 获取@model.id。所以,您在params[:myView_data]中获得的价值中包含 id 。总是。你需要这样做:

<%= link_to 'myController', myController_path(:myView_data => @data.name)%>

如果要更改此默认行为,可以在班级中执行此操作。只需覆盖模型中的to_param即可。像:

class MyModel < ActiveRecord::Base
  def to_param  # overridden
    data #a string
  end
end 

答案 1 :(得分:0)

首先,我想知道,

    MyModel.where(mymodel_id: '1').take

返回一个id。

更好地使用

    @data = MyModel.where(mymodel_id: '1').last.id

因为where将返回一个对象数组而不是单个对象

然后你可以用两种方式做到:

第一种方式,        使用存储在params [:myView_data]中的id,您可以找到整个对象

   name = MyModel.find(:id => params[:myView_data]).name
第二种方式,         你可以直接在视图中找到名字

   @data = MyModel.where(mymodel_id: '1').last.name

答案 2 :(得分:0)

<强>系统

要进一步Tiago Farias的答案,您需要考虑MVC programming pattern,其中Rails是围绕这些:

enter image description here

MVC 一开始很奇怪,因为它似乎有点不合逻辑。你可以想象它从“视图”开始,但你错了;它从“控制器”开始 - 按照请求调用。

Rails是stateless framework(基于HTTP构建),这意味着您发送的每个请求都被视为单独/唯一(而本机应用程序会将每个请求视为持久流的一部分)。这意味着您所做的一切(应用程序交互性的“逻辑”需要驻留在控制器中;这会将完全组装的Model对象传递给您的view

许多Rails开发人员(由于其进入门槛低而被框架吸引)的一个常见问题是他们要么不理解MVC流程,要么与MVC流程混淆;引导他们在其应用的Model中包含直接views次来电


<强>视图

我解释这个的原因是因为你需要理解Rails的object orientated性质。更具体地说,您需要如何在控制器中构建对象,将它们传递给views,然后在Model

中操纵它们

通常,您应该只将对象传递给您的视图。您的视图应该只向控制器传递一个“引用”(允许它为您构建正确的对象),让您的控制器与您的模型交谈:

#app/controllers/my_controller.rb
Class MyController < ApplicationController
   def my_view
     @data = MyModel.find 1
   end
end

#app/views/controller/my_view.html.erb
<%= link_to 'myController', myController_path(@data)%>

修复

您需要考虑非常重要的事情 - 您正在创建应用程序,而不是网站。因此,您需要使用“面向对象的编程”来确保您能够创建最有效的&amp;简洁的代码可能。

1. Appreciate the Rails Routing Structure
2. Appreciate the object-orientated backend
3. Appreciate how to build / deliver data to the frontend of your application

<强> Routing

如果必须将特定参数(myView_data)传递给控制器​​,则会导致路由混乱。这就是微软级别的复杂性

enter image description here

根据Rails的面向对象(资源)结构,您可以以相同的方式工作。在路由中使用resources指令围绕所需对象构建一系列CRUD方法:

#config/routes.rb
resources :my_controller #-> domain.com/my_controller/:id

这意味着您可以参考以下内容:

<%= link_to "Controller", my_controller_path(@object) %> #-> domain.com/my_controller/2

-

OOP后端

当您向控制器/模型后端发送数据时,您需要欣赏一些非常重要的东西 - 它将以面向对象的方式工作。这意味着它期望您发送标识primary_key以帮助Rails识别您正在使用的对象。

你根本不应该使用myView_data param - 它太冗长了&amp;复杂。 Rails倾向于convention over configuration意味着您应该专注于将id或唯一slug传递给您的后端:

#app/controllers/my_controller.rb
Class MyController < ApplicationController
   def show
      @model = Model.find params[:id]
   end
end

-

<强>前端

最后,你需要考虑你的前端

您将特定参数传递给后端,这意味着您必须已经在前端进行了此操作。你需要在对象周围构建你的前端 - 允许你create, read, update, destroy他们

您需要在应用程序中构建围绕这些对象的视图才能使其正常工作