Rails模型在控制器之间传递错误对象

时间:2012-03-27 19:56:55

标签: ruby-on-rails ruby object model

我环顾了S.O.网上的其他资源,我发现其他类似的问题,但不完全像我的。我确信那里有一个有效的回复,但我要求澄清这个问题,就像我要求找到解决方案一样。对不起,如果这对其他问题听起来多余,但我还没有找到明确回答我问题的内容。

我有一个应用程序,其中企业有一个列表页面,每个页面都有一个用户可以提交有关该业务的评论的部分。

每个商家页面都通过'merchants_controller'使用'show'操作处理:

  def show
    @merchant = Merchant.merchant_link_test(params[:id])
    @title = @merchant.name
      # used inside maps javascript
      @map_height = '290px'
      @map_width = '350px' 
    @user_reviews = Review.where(:merchant_id => @merchant.id).order("created_at....
    @user_reviews_count = Review.where(:merchant_id => @merchant.id).count 
    @user_or_merchant = 'merchant'
    @review = Review.new
    @average_rating = Review.where(:merchant_id => @merchant.id).average(:rating)
    @rounded = round_rating(@average_rating)
    @yelp_query = @merchant.yelp_string
    @yelp_count = yelp(@yelp_query, 'avg_rating')   
    @num_of_yelp = yelp(@yelp_query, 'review_count')
  end

我在“show”布局中有一部分显示用于提交有关该商家的评论的表单。表单输入通过'reviews_controller'使用'create'操作来处理:

   def create
     user = User.find_by_id(current_user.id)
     id = user.id
     @merchant = Merchant.find(params[:review][:merchant_id])
     params[:review].store(:user_id, id)
     @review = Review.new(params[:review])
     if @review.save
       flash[:success] = "Your review was submitted!" 
       redirect_to @merchant
     else
       flash[:error] = "There was an error submitting your review"
       render :template => 'merchants/show', :locals => { :id => @merchant.id, }
     end
   end

表单使用'form_for'帮助器,如下所示:

   <% if signed_in? %>
 <div class = "comment_form">
    <%= form_for @review do |f| %>
        <%= render 'shared/error_messages', :object => f.object %>
        <div class = "field">
            <div id = "required_rating"> * </div><%= f.label :rating %>
            </br>
            <%= f.select :rating, [['', ''],['1 star (terrible)', 1],        
                            ['2 stars', 2],['3 stars', 3],['4 stars', 4],['5 stars 
            (bomb.com)', 5]] %>
            </br>
        </div>
        <div class = "field">
            <div id = "required_comment"> * </div><%= f.label :comment, 
                             "Comment (limit 1000 characters)" %>
            <br/>
            <%= f.text_area :comment, :cols => 80, :rows => 6 %>
        </div>
        <div id = "denotes_text"> * Denotes required field </div>
        <div class = "actions">
            <%= f.submit "Submit Review" %>
        <% end %>
    <% else %>
        <div class = "sign_in_to_comment">
            <%= link_to "Sign in to submit a review of this merchant", 
                            signin_path %>
        </div>
     </div>
       <% end %>

我有两个表和两个模型,“商家”和“评论”,用于处理各自资源的数据。我的'routes'文件如下所示:

   resources :merchants, :only => [ :new, :create, :show ]

      match '/merchants/:name', :to => 'merchants#show'
      match '/merchants/:id/all', :to => 'comments#all_comments_merchant', :as => :all
      match '/merchants/:id/map', :to => 'merchants#map', :as => :map

   resources :reviews, :only => [ :create ]

我的问题是,当用户提交评论时,如果通过模型中的验证生成错误,则错误对象将传递回“reviews_controller”中的创建操作。然后,我想在'merchant_show_page'上显示该错误消息,但需要将错误对象从'reviews_controller'传递回'merchants_controller'。

根据我的阅读,似乎错误对象在同一控制器内的动作之间传递时具有一些“自动”功能。具体来说,似乎模型知道提交数据的操作并使用'render'返回错误对象,而无需初始化页面上的任何实例变量。

我见过的关于类似问题的一些解决方案:   1.将表单提交操作移动到'merchants_controller'中并丢失   'reviews_controller'一共。   2.使用'redirect_to'代替'render'并将错误对象作为变量传递给   重定向呼叫。

似乎必须有一个简单的“轨道方式”才能做到这一点。拥有单独的控制器似乎具有逻辑意义,它允许我将商家和评论作为单独的资源保持,从我所读到的,是我应该拍摄的正确的轨道惯例。这只是一个没有适当“轨道”的问题吗?如果是这样,我应该默认哪些其他的轨道惯例?

我们非常感谢您提供的任何帮助。

感谢您的帮助,

noob:)

0 个答案:

没有答案