2016-10-03 5 views
0

У меня есть две модели с именем Post и PostComment. В настоящее время я использую hidden_field форму хелперы для отправки дополнительных данных, как послеоперационное время, идентификатор пользователя комментария плакатом и пост ID, на котором комментарий делается так:Rails передает дополнительные параметры запросу без использования тега hidden_field

<%= f.hidden_field :posttime, value: Time.now.getutc %> 
<%= f.hidden_field :post_id, value: @post.id %> 
<%= f.hidden_field :user_id, value: current_user.id %> 

Он щелкнул поздно мне, что Я могу изменить эти значения с помощью инспекторов браузера и, следовательно, это нарушение безопасности. Итак, как я могу безопасно отправлять эти параметры?

ответ

1

Обычно эти значения не передаются через форму, но доступ к ним через URL с помощью вложенной URL-адресов (читать, как здесь: http://guides.rubyonrails.org/routing.html)

например, чтобы использовать post_id Сформируйте URL, вы бы установить свой комментарий чтобы включить сообщение, например, у вас будет new_post_comment_path, а в вашем контроллере вы можете получить доступ к params[:post_id], не передавая его через форму.

Ваша форма станет чем-то вроде этого:

<% form_for [@post, Comment.new] do |f| %> 
    ... 

Re: user_id - определенно не проходят, что в форме, вы совершенно правы, что это является проблемой большой безопасности (люди могли бы добавить комментарии для других людей!) Просто используйте его с помощью методов проверки подлинности (т.е. current_user) в вашем контроллере.

Вы бы в конечном итоге с чем-то, как это в вашем контроллере, например:

def create 
    @post = Post.find(params[:post_id]) 
    @comment = @post.comments.new(comment_params) 
    @comment.user = current_user 
    if @comment.save 
    redirect_to [@post, @comment] 
    else 
    render_action :new 
    end 
end 

private 

# Don't forget to use require/permit to make sure the user can't 
# fake up the user/post id fields themselves out of whole-cloth 
def comment_params 
    # or whatever your permitted comment-fields are. 
    params.require(:comment).permit(:content) 
end 
+0

Спасибо за расчистки многих вещи для меня. Я не знал, что параметр post_id автоматически передается, теперь это имеет смысл. Поскольку я использую devise, это не должно быть '@post_comment.user_id = current_user.id' (подразумевая, что ваша строка кода неверна или, по крайней мере, не соответствует соглашению) –

+0

Пока у вас есть пользователь' own_to: user 'в модели' Comment', вы можете использовать 'user' или' user_id', и они будут как Just Work :) Если у вас есть валидация на том или ином, то - используйте тот, у кого есть валидация ... (например 'validates_presence_of: user_id' означает, что вы должны предпочесть '@comment.user_id = current_user.id') –

+0

Отлично! Поскольку мы регистрируем идентификатор пользователя в самом контроллере, и я убедился, что форма видна пользователю только в том случае, если он зарегистрирован, нет права на правильность 'validates_presence_of: user_id'? –

1

Time.now.getutc и current_user.id уже имеются в наличии в вашем применения на create и update методов, так что вам не нужно проходить те назад. Что касается @post.id можно просто хранить, что в переменном сеансе в ваших new или edit методов ...

session[post_id] = @post.id 

, а затем в вашей create или `методе обновления ...

@post_comment.post_id = session[:post_id] 
+0

Мне совершенно не приходило в голову, что 'Time.now.utc' может использоваться внутри самого контроллера. Спасибо, что заметили. –

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