你如何从控制器传递数据与Ruby on Rails的模型?(How do you pass data

2019-06-23 19:30发布

你如何从控制器到模型传递数据?

在我application_controller我抢用户的位置(州,市)和包括before_filter ,使其在通过我的所有控制器入店

before_filter :community

def community
    @city = request.location.city
    @state = request.location.state
    @community = @city+@state
  end

然后我尝试添加控制器通过模型检索的数据:

before_save :add_community

def add_community
      self.community = @community
    end

该数据,但是,从来没有让从控制器到模型的方式。 如果我使用:

def add_community
    @city = request.location.city
    @state = request.location.state
    @community = @city+@state
    self.community = @community
  end

该方法request.location.cityrequest.location.state不从模型中发挥作用。 我知道这一切工作,因为如果我定义@city@state为字符串,下def_community ,然后一切正常,除了我没有一个动态的变量,只是放置在模型的字符串。 另外,我知道这些请求在控制器/视图的工作,因为我可以让他们来显示适当的动态信息。 这个问题仅仅是从控制器到模型中获取数据。 非常感谢您的时间。

Answer 1:

你摔跤的概念是MVC架构 ,大约是分离的责任。 该模型应该处理与数据库(或其它后端)交互,而无需他们在所使用的上下文的任何信息(无论它是一个HTTP请求或其他方式),视图不应该需要了解的后端,和控制器处理好两者之间的相互作用。

因此,在您的Rails应用程序的情况下,视图和控制器可以访问request对象,而您的模型没有。 如果你想从当前请求到模型传递信息,它是由控制器这样做。 我会定义add_community如下:

class User < ActiveRecord::Base

  def add_community(city, state)
    self.community = city.to_s + state.to_s  # to_s just in case you got nils
  end

end

然后在你的控制器:

class UsersController < ApplicationController

  def create  # I'm assuming it's create you're dealing with
    ...
    @user.add_community(request.location.city, request.location.state)
    ...
  end
end

我不想通过request直接对象,因为真正保持模型的当前请求的分离。 该User模型并不需要了解request对象以及它们如何工作。 它只知道它得到一个city和一个state

希望帮助。



Answer 2:

在控制器的类的实例变量(那些以@开始),从那些在模型分开。 这是该型号VS中的MVC架构控制器。 模型和控制器(和视图)是分开的。

您可以从一个控制器移动信息到模型明确。 在Rails和其他面向对象的系统,你有几种选择:

使用功能参数

# In the controller
user = User.new(:community => @community)

# In this example, :community is a database field/column of the 
# User model    

文件

使用实例变量属性setter方法

# In the controller
user = User.new
user.community = @community
# same as above, :community is a database field

将数据传递到模型时的数据不是一个数据库字段

# In the model
class User < ActiveRecord::Base
  attr_accessor :community
  # In this example, :community is NOT a database attribute of the 
  # User model. It is an instance variable that can be used
  # by the model's calculations. It is not automatically stored in the db

# In the controller -- Note, same as above -- the controller 
# doesn't know if the field is a database attribute or not. 
# (This is a good thing)
user = User.new
user.community = @community

文件



文章来源: How do you pass data from a controller to a model with Ruby on Rails?