Передача объекта ошибки модели Rails между контроллерами - PullRequest
1 голос
/ 27 марта 2012

Я посмотрел вокруг С.О. и другие ресурсы в Интернете, и я нахожу другие вопросы, которые похожи на этот, но не совсем как у меня. Я уверен, что есть ответ, который работает, но я прошу этот вопрос для разъяснения так же, как я прошу найти решение. Извините, если это звучит излишне для других вопросов, но я еще не нашел что-то, что определенно отвечает на мой вопрос.

У меня есть приложение, в котором у компаний есть страница со списком, и на каждой из этих страниц есть раздел, где пользователи могут отправлять комментарии об этом бизнесе.

Каждая бизнес-страница обрабатывается через '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 %>

У меня есть две таблицы и две модели: «продавцы» и «обзоры», которые обрабатывают данные для соответствующих ресурсов. Мой файл маршрутов выглядит так:

   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 ]

Моя проблема заключается в том, что когда пользователь отправляет комментарий, если в результате моих проверок в модели возникает ошибка, объект ошибки передается обратно действию create в 'reviews_controller.' Затем я хочу отобразить это сообщение об ошибке на странице «merchant_show_page», но мне нужно передать объект ошибки из «reviews_controller» обратно в «merchants_controller».

Из того, что я прочитал, кажется, что объект ошибки имеет некоторую «автоматическую» функциональность при передаче между действиями в одном контроллере. В частности, похоже, что модель знает действие, которое отправило данные, и возвращает объект ошибки, используя метод render, без необходимости инициализации каких-либо переменных экземпляра на странице.

Несколько решений, которые я видел в отношении похожих вопросов: 1. Переместите действие отправки формы в 'merchants_controller' и потеряйте 'reviews_controller' в целом. 2. Используйте «redirect_to» вместо «render» и передайте объект ошибки как переменную в перенаправить вызов.

Кажется, что для этого должен быть легкий, "рельсовый способ". Наличие отдельных контроллеров, кажется, имеет логический смысл, и это позволяет мне хранить продавцов и обзоры как отдельные ресурсы, что, из того, что я прочитал, является надлежащим соглашением о рельсах, для которого я должен стрелять. Является ли это просто проблемой, когда нет подходящего «рельсового пути» для этого? Если да, то по каким другим конвенциям по рельсам я должен соблюдать дефолт?

Любая помощь, которая может быть оказана, будет принята с благодарностью.

Спасибо за помощь,

noob:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...