2013-11-21 4 views
0

Я стараюсь делать отзывы пользователей, когда пользователь может написать отзыв другому пользователю, я создаю обзор таблиц с: content, user_reviews с: for_user_id и by_user_id, мои маршрутырельсы 4 данные не передаются на db

devise_for :users 
    resources :users, :only => [:show] do 
    resources :reviews 
    end 

class Review < ActiveRecord::Base 
    belongs_to :user 
    has_many :users, :through => :users_reviews 
end 

class User < ActiveRecord::Base 

    has_many :users_review 
    has_many :reviews, :through => :users_review 
end 

class UsersReview < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :review 
end 

class ReviewsController < ApplicationController 

    def new 
     @user = User.find(params[:user_id]) 
     @review = @user.reviews.new(params[:for_user_id]) 
    end 

    def create 
     @user = User.find(params[:id]) 
     @review = current_user.reviews.build(review_params) 
     redirect_to root_path 
    end 

    def show 
    end 

    def index 
     @user = User.find(params[:for_user_id]) 
     @reviews = Review.all 
    end 

    private 
    def review_params 
     params.require(:review).permit(:user_id, :user_id, :content) 
    end 

end 

и мой взгляд

<%= form_for([@user, @user.reviews.build]) do |f| %> 
<%= f.text_area :content, placeholder: "Your review" %> 
<%= f.submit "Go", class: "btn btn-large btn-primary" %> 
<% end %> 

всю работу, но никакие данные не отправить в БД: \ то, что я делаю неправильно?

ответ

0

Там есть ошибка в контроллере, я думаю:

def create 
    @user = User.find(params[:id]) 
    @review = @user.reviews.build(review_params) 
    @review.save 
    redirect_to root_path 
end 

Вы создавали новые Review с для current_user вместо @user.

+0

Неа, до сих пор ничего не спасет. – sevenseacat

+0

Я пропустил, чтобы включить метод 'save', мой плохой. Ответ обновлен. – marzapower

+0

это работает, но рельсы не отправляют данные в таблицу соединений, users_review – Adyl

3

Вы ничего не спасаете в методе create, поэтому ничего не сохранится.

Вы хотите что-то вроде:

def create 
    @user = User.find(params[:id]) 
    @review = @user.reviews.build(review_params) 

    if @user.save && @review.save 
    redirect_to root_path 
    else 
    (handle bad data) 
    end 
end 

Я также склонен согласиться с @marzapower - Если вы хотите использовать current_user, вам не нужна строка выше @review. Мой метод выше включает это изменение.

+0

yep, я нашел эту ошибку, но когда я исправлю это, рельсы отправят данные в таблицу обзоров и не отправят данные в user_review ... users_review пуст – Adyl

+0

См. Мое редактирование. Вы хотите создать '@ user.save' для создания ассоциации. См. Http://stackoverflow.com/questions/12654040/rails-create-through-record-via-association – CDub

+1

Поскольку он использует '<% = form_for ([@ user, @ user.reviews.build]) do | f | %> 'с конкретным пользователем, я сомневаюсь, что реальной целью является' current_user'. Это будет неправильное использование маршрутов вложенных ресурсов. – marzapower

2

Вы пропускаете вызов метода save в вашем create действия:

def create 
    @user = User.find(params[:id]) 
    @review = current_user.reviews.build(review_params) 
    @review.save 
    redirect_to root_path 
end 

Это post объясняет разницу между строить и создавать.

+0

yep, я нашел эту ошибку, но когда я исправлю это, рельсы отправят данные в обзорную таблицу и не отправят данные пользователю_review ... users_review пуст – Adyl

1

Думаю, вам не хватает двух вещей. Пользователю и обзорные классы оба должны ссылаться на класс UserReview, которые они используют в сквозном отношениях, например,

class User < ActiveRecord::Base 
    ... 
    has_many :user_reviews_received, class_name: 'UserReview', foreign_key: :for_user_id 
    has_many :reviews_received, through: :user_reviews_received, class_name: 'Review' 

    has_many :user_reviews_written, class_name: 'UserReview', foreign_key: :by_user_id 
    has_many :reviews_written, through: :user_reviews_written, class_name: 'Review' 
    ... 
end 

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

class ReviewsController < ActionController::Base 
    def new 
    @user = User.find(params[:user_id]) 
    @review = @user.reviews_received.new(by_user_id: current_user.id) 
    end 

    def create 
    @review = @user.reviews_received.create(params[:review].merge(by_user_id: current_user.id)) 
    redirect_to root_path 
    end 
end 

Второй вариант - разрешить его в виде (новая первая строка в форме).

<%= form_for([@user, @user.reviews_received.build(by_user_id: current_user.id)]) do |f| %> 
    <%= f.hidden_field :by_user_id %> 
    <%= f.text_area :content, placeholder: "Your review" %> 
    <%= f.submit "Go", class: "btn btn-large btn-primary" %> 
<% end %> 

я бы стремиться к чему-то, как первый вариант

+0

спасибо, но теперь rails выдает ошибку ActiveRecord :: UnknownAttributeError в ReviewsController # создать неизвестный атрибут: for_user_id @review = @ user.reviews.create (params [: review] .merge (for_user_id: params [: for_user_id])) Я думаю, что все мои проблемы находятся в db, в таблице users_review с for_user_id и by_user_id – Adyl

+0

Я мог бы так много сделать из вашего сообщения, поэтому я просто попытался получить новое и создать действия, чтобы согласиться. Если у вас есть by_user_id и for_user_id в модели Review, давайте обновим модель User, чтобы это отразить. – AndyV

Смежные вопросы