Я строию сайт рельсов, который имеет gyms
и reviews
. Я бы хотел, чтобы пользователи могли оставлять отзывы для спортзалов. Я мои таблицы установлены какРельсы вложенные ресурсы: контроллер и формы
class Gym < ActiveRecord::Base
has_many :pictures, as: :imageable
has_many :reviews
end
и
class Review < ActiveRecord::Base
belongs_to :user
belongs_to :gym
validates :body, presence: true, length: { maximum: 1000 }
validates :rating, presence: true
end
Сейчас контроллер тренажерного зала является статическим (могут не CRUD тренажерных зал, так как это админы вещь) и просто делают страницы ж/Информацию , Я пытаюсь добавить отзывы, но я не хочу смешивать ассоциации. Вот мой тренажерный зал информация контроллер
class GymsController < ApplicationController
before_action :logged_in_user, only: [:index, :edit, :update, :destroy]
before_action :correct_user, only: [:edit, :update]
def index
@q = Gym.ransack(params[:q])
@gyms = @q.result
@other_gyms = Gym.all
if @gyms.to_a.count < 1
flash[:warning] = "No gym matched #{params[:q][:name_or_phone_number_or_city_or_zip_code_cont]}"
end
end
def new
@gym = Gym.find(params[:id])
@review = @gym.review.new
end
def create
@gym = Gym.find(params[:id])
@review = @gym.reviews.build(gym_params)
if @review.save
flash[:success] = 'Review Saved'
redirect_to :back
else
render 'new'
end
end
def show
@gym = Gym.find(params[:id])
@reviews = @gym.reviews
end
private
def gym_params
params.require(:gym).permit(:name, :description, :address, :address_2, :zip_code,
:phone_number, :website_url, :city, :state, :latitude, :longitude,
review_attributes: [:user_id, :rating, :body, :gym_id])
end
def logged_in_user
unless logged_in?
store_location
flash[:danger] = 'Please log in'
redirect_to login_url
end
end
def correct_user
@user = User.find(params[:id])
redirect_to(root_url) unless current_user?(@user)
end
end
мои маршруты
resources :gyms, only: [:index, :show] do
resources :reviews
end
и тренажерный зал/показать link_to
, который указывает на gyms/:id/reviews
В спортзалах/у меня есть форму отзыва
<%= form_for [@gym, @review] do |f| %>
<%= f.label :rating, 'Select your rating' %>
<div id='ratyRating'></div><br>
<%= f.text_area :body, size: '100x10' %>
<%= f.hidden_field :user_id, value: current_user.id %>
<%= f.submit 'Post', class: 'btn btn-gen' %>
<% end %>
th не работает. и от кнопки link_to я получаю ее направляющей к gyms/:id/reviews
, которая является индексной страницей. Я чувствую, что есть намного лучший способ сделать это. Кто-нибудь видит, что я делаю неправильно здесь?
Я вижу, что в этом случае происходит не так, как ваш фильтр 'correct_user' получает пользователя id из 'params [: id]'. 'flash [: warning] =" Никакой спортзал не сопоставляется # {params [: q] [: name_or_phone_number_or_city_or_zip_code_cont]} "подвергает ваших пользователей уязвимости в инъекции, так как вы отсылаете назад параметры. – max
спасибо, что поймали это! Не имел представления. не могли бы вы подробнее рассказать? –
http://guides.rubyonrails.org/security.html#cross-site-scripting-xss – max