我环顾了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:)