9

Làm cách nào để truyền dữ liệu từ bộ điều khiển sang mô hình?Làm cách nào để truyền dữ liệu từ bộ điều khiển đến mô hình với Ruby on Rails?

Trong application_controller tôi lấy vị trí của người dùng (nhà nước và thành phố) và bao gồm một before_filter để làm cho nó accesible trong tất cả các bộ điều khiển của tôi qua

before_filter :community 

def community 
    @city = request.location.city 
    @state = request.location.state 
    @community = @[email protected] 
    end 

Sau đó, tôi cố gắng thêm các dữ liệu lấy trong bộ điều khiển để mô hình qua:

before_save :add_community 

def add_community 
     self.community = @community 
    end 

Dữ liệu, tuy nhiên, không bao giờ chuyển từ bộ điều khiển sang kiểu máy. Nếu tôi sử dụng:

def add_community 
    @city = request.location.city 
    @state = request.location.state 
    @community = @[email protected] 
    self.community = @community 
    end 

Các phương pháp request.location.cityrequest.location.state không hoạt động từ mô hình. Tôi biết rằng mọi thứ khác đang hoạt động bởi vì nếu tôi xác định @city@state làm chuỗi, dưới def_community, thì mọi thứ đều hoạt động, ngoại trừ tôi không có biến động, chỉ là một chuỗi được đặt trong mô hình. Ngoài ra, tôi biết các yêu cầu đang hoạt động trong bộ điều khiển/chế độ xem, bởi vì tôi có thể yêu cầu chúng hiển thị thông tin động thích hợp. Vấn đề đơn giản là lấy dữ liệu từ bộ điều khiển đến mô hình. Cảm ơn rất nhiều thời gian của bạn.

+0

Tôi đề nghị bạn xóa câu hỏi này hay kia của bạn, vì họ về cơ bản giống. Lần tới, nếu bạn muốn làm cho mọi thứ rõ ràng hơn, bạn chỉ có thể chỉnh sửa câu hỏi ban đầu của mình: http://stackoverflow.com/questions/10236645/getting-methods-that-work-in-controller-views-to-function-in -a-model-ruby-on-ra – tsherif

+0

Chào mừng bạn đến với StackOverflow! Hãy nhớ để upvote tất cả các câu trả lời mà bạn thấy hữu ích, bao gồm câu trả lời cho câu hỏi của người khác. "Chọn" (chọn) câu trả lời hay nhất cho câu hỏi của bạn. –

Trả lời

13

Khái niệm bạn đang đấu vật là MVC architecture, đó là về cách phân chia trách nhiệm. Các mô hình nên xử lý tương tác với DB (hoặc phần phụ trợ khác) mà không cần bất kỳ kiến ​​thức nào về ngữ cảnh mà chúng đang được sử dụng (cho dù đó là một yêu cầu HTTP hay không), các khung nhìn không cần phải biết về backend và các bộ điều khiển. xử lý tương tác giữa hai.

Vì vậy, trong trường hợp ứng dụng Rails của bạn, chế độ xem và bộ điều khiển có quyền truy cập vào đối tượng request, trong khi các mô hình của bạn thì không. Nếu bạn muốn chuyển thông tin từ yêu cầu hiện tại đến mô hình của bạn, điều đó tùy thuộc vào bộ điều khiển của bạn để thực hiện điều đó. Tôi sẽ xác định add_community của bạn như sau:

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 

Và sau đó trong điều khiển của bạn:

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 

Tôi không muốn vượt qua các đối tượng request trực tiếp, bởi vì đó thực sự duy trì sự tách biệt của mô hình từ hiện tại yêu cầu. Mô hình User không cần biết về các đối tượng request hoặc cách chúng hoạt động. Tất cả nó biết là nó nhận được một city và một state.

Hy vọng điều đó sẽ hữu ích.

+3

+1 cho "to_s chỉ trong trường hợp bạn có nils" –

+1

Mọi thứ hoạt động ngay bây giờ, cảm ơn bạn rất nhiều: D. – Laser

+1

@Laser Vui mừng khi được nghe :) Chúc mừng mã hóa! – tsherif

3

Các biến thể hiện lớp (các biến bắt đầu bằng @) trong các bộ điều khiển riêng biệt với các mô hình trong các mô hình. Đây là Model vs Controller trong kiến ​​trúc MVC. Mô hình và Bộ điều khiển (và xem) được tách ra.

Bạn di chuyển thông tin từ bộ điều khiển sang mô hình một cách rõ ràng.Trong Rails và hệ thống hướng đối tượng khác, bạn có nhiều lựa chọn:

Sử dụng chức năng thông số

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

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

Docs

thuộc tính Sử dụng các biến dụ setters

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

đèo ing dữ liệu để mô hình khi dữ liệu không phải là một lĩnh vực cơ sở dữ liệu

# 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 

Docs

Các vấn đề liên quan