2015-01-06 2 views
1

Я пытаюсь добавить скрытое поле в comments/_form, чтобы имя пользователя появилось в разделе комментариев. Ничего я не работаю. Я действительно хочу использовать скрытое поле, поэтому я знаю, как заставить его работать.Как передать скрытое поле user_id для комментариев?

У пользователя есть много комментариев, и комментарии к ним принадлежат пользователю.

Это то, что я в настоящее время в comments/_form:

<%= form_for([@place, @place.comments.build]) do |f| %> 
    <%= hidden_field :user_id, :value => @user.id %> 
    <p> 
    <%= f.label :body %><br> 
    <%= f.text_field :body %> 
    </p> 
    <p> 
    <%= f.submit %> 
    </p> 
    <% end %> 

Это то, что я в настоящее время в _comment.html.erb Пожалуйста, обратите внимание на comment.user.first_name.

Это ошибка я получаю undefined method first_name»для ноль: NilClass`:

<p> 
    <strong>Comment:</strong><br /> 
    <%= comment.user.first_name %> wrote:<br /><br> 
    <%= comment.body %> 
</p> 

<p> 
    <%= link_to 'Destroy Comment', [comment.place, comment], 
      method: :delete, 
      data: { confirm: 'Are you sure?' } %> 
</p> 

Это то, что я имею в comments_controller

class CommentsController < ApplicationController 

    def create 
    @place = Place.find(params[:place_id]) 
    @comment = @place.comments.create(comment_params) 
    redirect_to place_path(@place) 
    end 

    def destroy 
    @place = Place.find(params[:place_id]) 
    @comment = @place.comments.find(params[:id]) 
    @comment.destroy 
    redirect_to place_path(@place) 
end 

private 
    def comment_params 
     params.require(:comment).permit(:body, :user_id) 
    end 
end 

Это то, что я имею в ApplicationController:

helper_method :current_user 

    private 
    def current_user 
    @current_user ||= User.find(session[:user_id]) if session[:user_id] 
    end 

У кого-нибудь есть совет?

EDIT Я добавляю еще пару вещей для назидания на случай, если это поможет.

Пользователи контроллер

class UsersController < ApplicationController 
    def new 
     @user = User.new 
    end 

    def create 
    @user = User.new(user_params) 
     if @user.save 
     redirect_to root_url, :notice => "Signed Up!" 
    else 
     render "new" 
    end 
    end 

end 

private 
    def user_params 
     params.require(:user).permit(:email, :password, :password_confirmation) 
    end 

Сессии контроллер

class SessionsController < ApplicationController 
    def new 
    end 

    def create 
     user = User.authenticate(params[:email], params[:password]) 
     if user 
     session[:user_id] = user.id 
     redirect_to places_path, :notice => "Logged in!" 
     else 
     flash.now.alert = "Invalid email or password" 
     render "new" 
     end 
    end 

    def destroy 
     session[:user_id] = nil 
     redirect_to root_url, :notice => "Logged out!" 
    end 

    end 

мест контроллер

class PlacesController < ApplicationController 

    def index 
    @places = Place.all 
    end 


    def new 
    @place = Place.new 
    end 

    def create 
    @place = Place.new(place_params) 

    if @place.save 
     redirect_to @place 
    else 
    render 'new' 
    end 
end 

def show 
    @place = Place.find(params[:id]) 
end 

def edit 
    @place = Place.find(params[:id]) 
end 

def update 
    @place = Place.find(params[:id]) 
    if @article.update(place_params) 
    redirect_to @place 
    else 
    render 'edit' 
    end 
end 

def destroy 
    @place = Place.find(params[:id]) 
    @place.destroy 

    redirect_to places_path 
end 


end 

private 
    def place_params 
    params.require(:place).permit(:name, :location) 
    end 

ответ

3

Eсть не нужно отправлять его через hidden_field, а не удалять его.

Перепишите ваш метод create следующим образом:

def create 
    @place = Place.find(params[:place_id]) 
    @comment = @place.comments.create(comment_params) 
    @comment.user = current_user 
    if @comment.save 
    redirect_to place_path(@place) 
    else 
    render "comments/_form" 
    end 
end 

Надеется, что это помогает.

+0

Привет @Rajesh Omanakuttan, спасибо за то, что нашли время, чтобы ответить. Я реализовал то, что вы предложили в своем ответе, т. Е. Удалив скрытое поле и добавив то, что вы предложили в методе создания выше. Оставил все остальное неповрежденным. Я все еще получаю сообщение об ошибке. Это либо пустое имя, но как минимум сообщение и комментарий появляются ИЛИ Я получаю этот 'undefined method' first_name 'для nil: NilClass'. Любые идеи, почему это происходит? – user273072545345

+0

Странно, я просто попробовал '<% = comment.user.email%>' в '_comment.html.erb', и он показывает адрес электронной почты в некоторых сообщениях или эту ошибку' undefined method 'email 'для nil: NilClass '. Но дело в том, что он показывает адрес электронной почты! Почему это делается для этого, но не для имени? Извините, просто для уточнения, это с измененным кодом, как указано в комментарии выше. – user273072545345

+0

Я думаю его '@ комментарий', а не' комментарий'. –

0

Примечание: Это не ответ на первоначальный вопрос, это исправление ошибки (но его слишком большое для комментария)

Ошибки происходит потому, что current_user возвращается nil, есть два опции в зависимости ваши требования,

1)

CommentsController < ApplicationController 
    before_filter :current_user 
    ... 
end 

2)

ApplicationController < ActionController::Base 
    before_filter :current_user 
    ..... 
end 

---- обновленный метод

def current_user 
    if session[:user_id] 
     @current_user ||= User.find(session[:user_id]) if session[:user_id] 
    else 
     #redirect user to login to set the session[:user_id] variable 
    end 
    end 
+0

нет кости. Пробовал это в обоих. Все еще получена эта ошибка 'undefined method' user 'для nil: NilClass'. Все остальное нетронутым, за исключением изменений, предложенных в результате первоначального ответа. Обновите мой пост дополнительными, если это поможет. Спасибо, что пытались помочь. – user273072545345

+0

oops, в моем комментарии отсутствует одно, если у вас нет 'session [: user_id]', тогда вы должны перенаправить пользователей для входа в систему (обновленный мой ответ ..) – sameera207

+0

У меня есть 'сеансы [: user_id]' , Пожалуйста, посмотрите мой контроллер сеанса. Если я понимаю последствия вашего комментария 'session [: user_id]', я не пытаюсь отобразить first_name при входе в систему, но ТАКЖЕ, когда выйдет из системы. – user273072545345

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