我有一个观点
#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
如果有可能,请帮助:)谢谢
答案 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是围绕这些:
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
)传递给控制器,则会导致路由混乱。这就是微软级别的复杂性
根据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
他们
您需要在应用程序中构建围绕这些对象的视图才能使其正常工作