代码之家  ›  专栏  ›  技术社区  ›  jake

将params集合从controller传递到model会破坏MVC吗?

  •  3
  • jake  · 技术社区  · 16 年前

    4 回复  |  直到 16 年前
        1
  •  4
  •   Daniel Lucraft    16 年前

    视情况而定。您正在向模型传递一个散列数据并说“理解这个”。

    class Model < ActiveRecord::Base
      def update_from_params(params)
        ....
      end
    end
    
    class ModelsController < ActionController::Base
      def update
        ...
        @model.update_from_params(params)
      end
    end
    

    class Model < ActiveRecord::Base
      def update_from_update_params(params)
        # do stuff
      end
    
      def update_from_settings_params(params)
        # do different stuff
      end
    
    end
    
    class ModelsController < ActionController::Base
      def update
        ...
        @model.update_from_update_params(params)
      end
    
      def change_settings
        ...
        @model.update_from_settings_params(params)
      end
    end
    

    这是不好的,你是让模型做控制器的工作。一个合理的折衷方法是在模型上创建一个接受规范数据哈希的方法,然后在控制器中的参数和规范哈希之间进行转换:

    class Model < ActiveRecord::Base
      def update_from_data(hash)
        validate_data!(hash)
        # do stuff
      end
    end
    
    class ModelsController < ActionController::Base
      def update
        ...
        @model.update_from_data(translate_update_params)
      end
    
      def change_settings
        ...
        @model.update_from_data(translate_change_settings_params)
      end
    end
    

    尽管您应该确保仔细记录模型接受的数据散列的格式。实际上,我们甚至使用了YAML验证库( Rx )以确保模型只接受有效数据。

    很抱歉回答太长,但我没有时间写一个简短的;)。

        2
  •  1
  •   paxdiablo    16 年前

    我想肯定是的。

    params散列有很多你的模型不需要的东西。基本上你忽略了MVC的C部分。你想做的事情会起作用(也就是说它会执行),但是我认为你应该把参数作为单独的实体传递进来。

        3
  •  1
  •   Kris    16 年前

    我建议传递params的一个子集,这样您只传递模型需要的内容。

    在控制器中:

    # in controller
    def search
      Model.search(params[:search][:options])
    end
    

    只需确保您的输入是“namespace”,这样您就可以得到一个嵌套的哈希:

    <!-- in view -->
    <input type='text' name='search[options][keywords]' />
    <input type='text' name='search[options][conditions]' />
    <input type='text' name='search[options][sort]' />
    

    def self.do_search(criteria)
    
            Rental.search(criteria[:keywords], 
                          :per_page => self.per_page,
                          :page => page,
                          :conditions => criteria[:conditions],
                          :order => criteria[:sort])
    
    end
    
        4
  •  0
  •   Jamie    16 年前

    我不相信,但话说回来,我不是rails的老手。通常,params散列在控制器中使用,并且该操作可能读取和写入模型信息,也可能不读取和写入模型信息,因此我猜如果params要通过属于该模型的方法,则是相同的事情。

    不管怎样,我认为您仍然需要通过控制器发送参数,所以为什么不在那里进行处理,然后通过模型的方法将处理后的数据发送到模型?